引言在bash脚本编程中,关联数组(associative array)是一种非常强大的数据结构,它允许我们使用字符串作为索引,实现类似于哈希表的功能。在处理需要根据键进行快速查找和统计的场景时,关联数组能够显著简化代码逻辑。本文将通过一个完整的实战脚本array-2,详细讲解如何利用关联数组统计一个目录下所有文件的所有者和组所有者,并输出格式化且排序后的结果。1. 脚本功能预览array-2脚本接收一个目录作为参数,遍历该目录下的所有文件,提取每个文件的属主(owner)和属组(group),然后输出每个文件及其属主和属组信息,最后分别统计每个属主和每个属组拥有的文件数量。输出结果按字母顺序排序,便于阅读。以下是针对/usr/bin目录运行脚本的示例输出(已做精简):/usr/bin/2to3-2.6 root root /usr/bin/2to3 root root ... /usr/bin/zsoelim root root File owners: daemon : 1 file(s) root : 1394 file(s) File group owners: crontab : 1 file(s) daemon : 1 file(s) ... root : 1380 file(s)2. 关联数组的声明与初始化在bash中,关联数组必须使用declare -A显式声明,否则会被当作普通数组(普通数组只能使用整数索引)。在脚本的第5行,我们一次性声明了五个关联数组:declare-Afiles file_group file_ownergroupsownersfiles:键为文件名,值为文件名本身,用于后续遍历。file_group:键为文件名,值为该文件所属的组。file_owner:键为文件名,值为该文件的属主。groups:键为组名,值为属于该组的文件数量。owners:键为属主名,值为该属主拥有的文件数量。3. 检查目录参数与错误处理脚本的第7-10行检查用户是否提供了一个有效的目录:if[[!-d"$1"]];thenecho"Usage: array-2 dir"2exit1fi如果$1不是目录,则输出用法信息并退出。注意输出重定向到stderr(2),符合标准错误处理的惯例。4. 遍历文件并提取所有者/组信息第12-20行的for循环遍历指定目录下的所有文件(使用"$1"/*通配):foriin"$1"/*;doowner="$(stat-c%U"$i")"group="$(stat-c%G"$i")"files