访问数组元素
那么数组有什么用呢? 正如电子表格程序可以执行许多数据管理任务一样,许多编程任务也可以使用数组执行。
让我们考虑一个简单的数据收集和演示示例。 我们将构建一个脚本来检查指定目录中文件的修改时间。 根据这些数据,我们的脚本将输出一个表格,显示文件上次修改的时间。 这样的脚本可用于确定系统何时最活跃。 这个脚本叫做 个小时里, 产生这个结果:
[我@linuxbox ~]$ 小时 。
小时 | 档 | 小时 | 档 |
---- | ----- | ---- | ----- |
00 | 0 | 12 | 11 |
01 | 1 | 13 | 7 |
02 | 0 | 14 | 1 |
03 | 0 | 15 | 7 |
04 | 1 | 16 | 6 |
05 | 1 | 17 | 5 |
06 | 6 | 18 | 4 |
07 | 3 | 19 | 4 |
08 | 1 | 20 | 1 |
09 | 14 | 21 | 0 |
10 | 2 | 22 | 0 |
11 | 5 | 23 | 0 |
文件总数 = 80
我们执行 个小时里 程序,将当前目录指定为目标。 它生成一个表格,显示一天中每个小时 (0-23) 上次修改的文件数。 产生这个的代码如下:
#!/斌/庆典
# hours: 通过修改时间使用来统计文件的脚本 () {
echo "用法:${0##*/} 目录" >&2
}
#!/斌/庆典
# hours: 通过修改时间使用来统计文件的脚本 () {
echo "用法:${0##*/} 目录" >&2
}
# 检查该参数是否为目录 if [[ ! -d $1]]; 然后
用法出口 1
fi
# 初始化数组
对于 {0..23} 中的 i; 做 hours[i]=0; 完毕
# 收集数据
for i in $(stat -c %y "$1"/* | cut -c 12-13); 做 j=${i/#0}
((++小时[j])) ((++计数))
完成
# 显示数据
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t-----\t----\t-----" for i in {0..11} ; 做
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} 完成
printf "\n总文件数 = %d\n" $count
# 检查该参数是否为目录 if [[ ! -d $1]]; 然后
用法出口 1
fi
# 初始化数组
对于 {0..23} 中的 i; 做 hours[i]=0; 完毕
# 收集数据
for i in $(stat -c %y "$1"/* | cut -c 12-13); 做 j=${i/#0}
((++小时[j])) ((++计数))
完成
# 显示数据
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t-----\t----\t-----" for i in {0..11} ; 做
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} 完成
printf "\n总文件数 = %d\n" $count
该脚本包含一个函数 (用法) 和具有四个部分的主体。 在第一部分中,我们检查是否有命令行参数并且它是一个目录。 如果不是,我们会显示使用信息并退出。
第二部分初始化数组 个小时里. 它通过为每个元素分配零值来实现这一点。 在使用之前没有特别要求准备数组,但是我们的脚本需要确保没有元素为空。 请注意构建循环的有趣方式。 通过使用大括号扩展 ({0..23}),我们能够轻松地为 HPMC胶囊 命令。
下一部分通过运行 统计 目录中的每个文件上的程序。 我们用 切 从结果中提取两位数的小时。 在循环内部,我们需要从小时字段中删除前导零,因为 shell 会尝试(并最终失败)将值“00”到“09”解释为八进制数(见表 34-2)。 接下来,我们递增与一天中的小时对应的数组元素的值。 最后,我们增加一个计数器(数) 来跟踪目录中的文件总数。
脚本的最后一部分显示数组的内容。 我们首先输出几个标题行,然后进入一个产生四列输出的循环。 最后,我们输出文件的最终计数。