数组

跟其它程序设计语言一样,bash中的数组变量给了你引用多个值的能力。在bash中,数组下标也是从0开始,也就是说,第一个元素的下标是0。

跟数组打交道时,要注意一个特殊的环境变量IFSIFS,全称 Input Field Separator,保存了数组中元素的分隔符。它的默认值是一个空格IFS=' '

数组声明

在bash中,可以通过简单地给数组变量的某个下标赋值来创建一个数组:

  1. fruits[0]=Apple
  2. fruits[1]=Pear
  3. fruits[2]=Plum

数组变量也可以通过复合赋值的方式来创建,比如:

  1. fruits=(Apple Pear Plum)

数组扩展

单个数组元素的扩展跟普通变量的扩展类似:

  1. echo ${fruits[1]} # Pear

整个数组可以通过把数字下标换成*@来扩展:

  1. echo ${fruits[*]} # Apple Pear Plum
  2. echo ${fruits[@]} # Apple Pear Plum

上面两行有很重要(也很微妙)的区别,假设某数组元素中包含空格:

  1. fruits[0]=Apple
  2. fruits[1]="Desert fig"
  3. fruits[2]=Plum

为了将数组中每个元素单独一行输出,我们用内建的printf命令:

  1. printf "+ %s\n" ${fruits[*]}
  2. # + Apple
  3. # + Desert
  4. # + fig
  5. # + Plum

为什么Desertfig各占了一行?尝试用引号包起来:

  1. printf "+ %s\n" "${fruits[*]}"
  2. # + Apple Desert fig Plum

现在所有的元素都跑去了一行 —— 这不是我们想要的!为了解决这个痛点,${fruits[@]}闪亮登场:

  1. printf "+ %s\n" "${fruits[@]}"
  2. # + Apple
  3. # + Desert fig
  4. # + Plum

在引号内,${fruits[@]}将数组中的每个元素扩展为一个单独的参数;数组元素中的空格得以保留。

数组切片

除此之外,可以通过 切片 运算符来取出数组中的某一片元素:

  1. echo ${fruits[@]:0:2} # Apple Desert fig

在上面的例子中,${fruits[@]}扩展为整个数组,:0:2取出了数组中从0开始,长度为2的元素。

向数组中添加元素

向数组中添加元素也非常简单。复合赋值在这里显得格外有用。我们可以这样做:

  1. fruits=(Orange "${fruits[@]}" Banana Cherry)
  2. echo ${fruits[@]} # Orange Apple Desert fig Plum Banana Cherry

上面的例子中,${fruits[@]}扩展为整个数组,并被置换到复合赋值语句中,接着,对数组fruits的赋值覆盖了它原来的值。

从数组中删除元素

unset命令来从数组中删除一个元素:

  1. unset fruits[0]
  2. echo ${fruits[@]} # Apple Desert fig Plum Banana Cherry