bash shell 中的数组
简介
bash shell 提供了两种一维数组,分别是 index array 和 associative array,常见的翻译是索引数组和关联数组。任何变量都可以用作数组,也就是说如果你使用了数组赋值的语法操作变量(name[subscript]=value),则变量默认会转换为索引数组。同时你也可以使用declare显示地定义数组。比如declare -a array。
index array 和 associative array 的区别
<1> 定义方式不同
index array, 可以是自动生成或者显示指定变量为数组: declare -a index_array
associative array, 必须显示指定变量为关联数组: declare -A associative_array
<2> index array 的下标必须是大于0的数字或者可以计算出大于0数字的逻辑表达式,而associative array 的下标可以是字符串
输出了以下结果,可以看到index array的下标0的值被覆盖了一次。如果脚本设置了 set -u, 那么给index array 下标使用字符串这种操作还会导致脚本报错并且停止。
基本使用方法
对于 index array 和 associative array 的使用,只需要注意 index array 的 key 不要使用字符串即可。当然也不是绝对不可以使用,只不过会出现上面描述的错误而已。
<1> 初始化
对于 index array name=(value1 value2 value3)
对于 associative array name=([key1]=value1 [key2]=value2 [key3]=value3)
<1> 获取数组元素个数
elem_count=${@name[@]}
<2> 引用数组中的元素
value=${name[$key]}
<3> 数组元素赋值
name[$key]=value
<4> 输出所有的键
keys=${!name[*]} 或者 keys=${!name[@]}
<5> 输出所有的值
values=${name[*]} 或者 values=${name[@]}
<6> 删除数组元素
unset name[$index] 删除某个元素
unset name 删除整个数组
<7> 获取数组的一部分
注意这个功能只有 index array 适用
${name:0:3}
0是起始下标,3是元素个数。获取从下标0开始的3个元素。
如果起始下标超过元素个数,则什么也不会输出
如果起始下标是负数,则会输出错误的字符串(为什么这么输出我没有去研究,有兴趣可以试下)
<8> 连接2个数组
注意只有 index array 可以这样操作,如下面的代码
输出:
<9> 遍历数组以及使用 * 和 @ 的区别
看以下代码:
输出如下:
使用 * 和 @, 只有二者被双引号包围起来的时候才会有区别。可以使用 * 的时候,解释出的东西会被当成一个字符串,可以看到遍历的时候数组中所有的键被IFS的第一个字符(空格)隔开,并当成一个字符串输了出来。但是使用@,每个键则会被单独解释。这个规则对于数组的值来说也是一样的。遍历数组的时候这里需要特别注意一下。
其他的使用技巧
declare 命令对变量设置属性也可以和数组配合起来使用,declare设置的变量属性会作用于数组的每一个值上。如以下代码,设置数组中每个值为只读:
输出:
也可以使用 -i 设置值必须为整数,使用-u设置值里面所有的字母都必须为大写等等。