Shell中的关联数组

在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/

master

Stay hungry, stay foolish.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

*