在Bash中,普通的数组是下标数组,其元素是通过数组下标(小表是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时不太翻遍。
其实Bash也提供了关联数组(associative array)的支持。关联数组可以使用任意的字符串作为下标(不必是整数)来访问数组元素。关联数组的下标和值称为键值对,它们是一一对应的关系;其实就类似于Python中的字典。在关联数组中,键是唯一的,值可以不唯一。
定义关联数组
Bash中关联数组和下标数组在定义和使用上完全一样,只是在索引上有区别。
需要注意的是,在使用关联数组之前,需要使用命令 **declare -A array ** 进行声明。
关联数组的操作语法和下表数组完全一致,几个常见的操作如下:
1 2 3 4 5 6 7 8 |
语法 描述 ${!array[*]} 取关联数组所有键 ${!array[@]} 取关联数组所有键 ${array[*]} 取关联数组所有值 ${array[@]} 取关联数组所有值 ${#array[*]} 关联数组的长度 ${#array[@]} 关联数组的长度 |
实际使用关联数组的一个例子,如下:
其功能是下载几个文件并且检查它们的MD5值;用关联数组来保存文件名称与其MD5的关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash # download some files and check md5 declare -A tgz_array tgz_array=([file1.tgz]=f1cdbcba49e92618ec4739065d670df1 [file2.tgz]=f2435c8de754f7d4992a924cbc4e7bf2) server_ip='127.0.0.1' for file_name in ${!tgz_array[*]} do echo "file_name:${file_name} md5:${tgz_array[$file_name]}" echo "wget -q http://${server_ip}/$file_name -O /tmp/$file_name" wget -q http://${server_ip}/$file_name -O /tmp/$file_name if [ $? -eq 0 ]; then echo "download file success. $file_name" else echo "download file failed. $file_name" exit 1 fi if ! md5sum /tmp/$file_name | grep -q "${tgz_array[$file_name]}"; then echo "error! failed to check file md5. $file_name" exit 1 fi done |
另外,关于shell中的数组,几年前也总结过一次:http://smilejay.cn/2016/04/array-in-bash/