Bash从4.0的版本开始就可以使用关联数组了
关联数组的下标可以采用非整型类型,类似于java中的key-value类型,其中,key为下标,value为对应的元素的值,key唯一,value可以不唯一。
使用关联数组前应该先声明 declare -A array
然后就可以像使用普通数组一样使用关联数组了,如下所示:
[root@gitlab ~]# declare -A guilin
[root@gitlab ~]# guilin[“name”]=”chenguilin”
[root@gitlab ~]# guilin[“sex”]=”男”
[root@gitlab ~]# guilin[“age”]=”25″
遍历数组下标,我知遍历数组的元素值使用的是${guilin[*]}
那么我们取反${!guilin[*]}
不就是下标吗
[root@gitlab ~]# for key in ${!guilin[*]}; do echo $key; done; name age sex
遍历数组元素的值
[root@gitlab ~]# for key in ${guilin[*]}; do echo $key; done; chenguilin 25 男
其他使用方法:
echo ${!guilin[*]} #取关联数组所有键 echo ${!guilin[@]} #取关联数组所有键 echo ${guilin[*]} #取关联数组所有值 echo ${guilin[@]} #取关联数组所有值 echo ${#guilin[*]} #取关联数组长度 echo ${#guilin[@]} #取关联数组长度
在为关联数组赋值时,不加”$”,而是直接 guilin[“name”]=chenguilin ,在取值的时候,要加”$”,如 $guilin[“sex”] 则得到的是男
清空数组元素 unset guilin[“sex”] ,但是这样清空后,array中仍有“sex”这个key,只是其对应的值被清空了
清空整个数组 unset guilin,但是这样清空后,guilin的key是没有了,但是整个guilin也不能再用了,如下所示:
declare -A guilin guilin["chenguilin"]=chenguilin unset guilin guilin["sex"]=25
则会出错:语法错误,也就是在unset guilin之后,该guilin不再是关联数组,所以key不可以用非整型来做索引
所以我只能如下解决:
declare -A guilin guilin["sex"]=25 unset guilin [root@gitlab ~]# declare -A guilin [root@gitlab ~]# guilin["sex"]=25 [root@gitlab ~]# echo ${guilin["sex"]} 25
判断某一个key是否在该关联数组中,如下所示:
function isInCountResult(){ for key in ${!count_result[*]} do if [ "$1" = "$key" ] then return 0 fi done return 1 }
这里需要注意,shell脚本中的if判断中,返回0为true,返回1为false
关于使用shell的普通数组:
把数组当做参数在函数之间传递时,在一个帖子里看到如下的方法:
function f1(){ declare -a array array[0]="h1" array[1]="h2" arr=`echo "${array[*]}"` local val="h1" f2 $val $arr } function f2(){ local arr2=`echo "$2"` for value in ${arr2[*]} do echo "value: $value" done }
但是运行完,发现只是传递了array中的第一个值,即h1,
如果使用f2 $val “${array[*]}”, 传递的仍然是第一个值,最后还是没有找到办法能把整个数组传递过去
在使用unset 删除普通数组元素是,例如unset array[0] 其实删除的只是对应的值,但是array[0]这个位置仍然在,原来的array[1]现在仍是array[1],而不会变为array[0]