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