数组
跟其它程序设计语言一样,bash中的数组变量给了你引用多个值的能力。在bash中,数组下标也是从0开始,也就是说,第一个元素的下标是0。
跟数组打交道时,要注意一个特殊的环境变量IFS
。IFS,全称 Input Field Separator,保存了数组中元素的分隔符。它的默认值是一个空格IFS=' '
。
数组声明
在bash中,可以通过简单地给数组变量的某个下标赋值来创建一个数组:
fruits[0]=Apple
fruits[1]=Pear
fruits[2]=Plum
数组变量也可以通过复合赋值的方式来创建,比如:
fruits=(Apple Pear Plum)
数组扩展
单个数组元素的扩展跟普通变量的扩展类似:
echo ${fruits[1]} # Pear
整个数组可以通过把数字下标换成*
或@
来扩展:
echo ${fruits[*]} # Apple Pear Plum
echo ${fruits[@]} # Apple Pear Plum
上面两行有很重要(也很微妙)的区别,假设某数组元素中包含空格:
fruits[0]=Apple
fruits[1]="Desert fig"
fruits[2]=Plum
为了将数组中每个元素单独一行输出,我们用内建的printf
命令:
printf "+ %s\n" ${fruits[*]}
# + Apple
# + Desert
# + fig
# + Plum
为什么Desert
和fig
各占了一行?尝试用引号包起来:
printf "+ %s\n" "${fruits[*]}"
# + Apple Desert fig Plum
现在所有的元素都跑去了一行 —— 这不是我们想要的!为了解决这个痛点,${fruits[@]}
闪亮登场:
printf "+ %s\n" "${fruits[@]}"
# + Apple
# + Desert fig
# + Plum
在引号内,${fruits[@]}
将数组中的每个元素扩展为一个单独的参数;数组元素中的空格得以保留。
数组切片
除此之外,可以通过 切片 运算符来取出数组中的某一片元素:
echo ${fruits[@]:0:2} # Apple Desert fig
在上面的例子中,${fruits[@]}
扩展为整个数组,:0:2
取出了数组中从0开始,长度为2的元素。
向数组中添加元素
向数组中添加元素也非常简单。复合赋值在这里显得格外有用。我们可以这样做:
fruits=(Orange "${fruits[@]}" Banana Cherry)
echo ${fruits[@]} # Orange Apple Desert fig Plum Banana Cherry
上面的例子中,${fruits[@]}
扩展为整个数组,并被置换到复合赋值语句中,接着,对数组fruits
的赋值覆盖了它原来的值。
从数组中删除元素
用unset
命令来从数组中删除一个元素:
unset fruits[0]
echo ${fruits[@]} # Apple Desert fig Plum Banana Cherry