在Bash中,普通的数组是下标数组,其元素是通过数组下标(小表是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时不太翻遍。
其实Bash也提供了关联数组(associative array)的支持。关联数组可以使用任意的字符串作为下标(不必是整数)来访问数组元素。关联数组的下标和值称为键值对,它们是一一对应的关系;其实就类似于Python中的字典。在关联数组中,键是唯一的,值可以不唯一。
定义关联数组
Bash中关联数组和下标数组在定义和使用上完全一样,只是在索引上有区别。
需要注意的是,在使用关联数组之前,需要使用命令 **declare -A array ** 进行声明。
关联数组的操作语法和下表数组完全一致,几个常见的操作如下:
语法 描述
${!array[*]} 取关联数组所有键
${!array[@]} 取关联数组所有键
${array[*]} 取关联数组所有值
${array[@]} 取关联数组所有值
${#array[*]} 关联数组的长度
${#array[@]} 关联数组的长度
实际使用关联数组的一个例子,如下:
其功能是下载几个文件并且检查它们的MD5值;用关联数组来保存文件名称与其MD5的关系。
#!/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/