9. bash 数组详解

1.创建数组

数组(array)是一个包含多个值的变量。成员的编号从0开始,数量没有上限,也没有要求成员被连续索引。

数组可以采用逐个赋值的方法创建。

ARRAY[INDEX]=value

上面语法中,ARRAY是数组的名字,可以是任意合法的变量名。INDEX是一个大于或等于零的整数,也可以是算术表达式。注意数组第一个元素的下标是0, 而不是1。

下面创建一个三个成员的数组。

array[0]=val
array[1]=val
array[2]=val

数组也可以采用一次性赋值的方式创建。

ARRAY=(value1 value2 ... valueN)

# 等同于

ARRAY=(
  value1
  value2
  value3
)

采用上面方式创建数组时,可以按照默认顺序赋值,也可以在每个值前面指定位置。

array=(a b c)
array=([2]=c [0]=a [1]=b)

days=(Sun Mon Tue Wed Thu Fri Sat)
days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)

只为某些值指定位置,也是可以的。

names=(hatter [5]=duchess alice)

上面例子中,hatter是数组的0号位置,duchess是5号位置,alice是6号位置。

没有赋值的数组元素的默认值是空字符串。

定义数组的时候,可以使用通配符。

mp3s=( *.mp3 )

上面例子中,将当前目录的所有 MP3 文件,放进一个数组。

先用declare -a命令声明一个数组,也是可以的。

declare -a ARRAYNAME

read -a命令则是将用户的命令行输入,存入一个数组。

read -a dice

上面命令将用户的命令行输入,存入数组dice

image.png

2.读取数组

2.1 读取单个元素

读取数组指定位置的成员,要使用下面的语法。

echo ${array[i]}     # i 是索引

上面语法里面的大括号是必不可少的,否则 Bash 会把索引部分[i]按照原样输出。

array[0]=a

echo ${array[0]}

echo $array[0]

上面例子中,数组的第一个元素是a。如果不加大括号,Bash 会直接读取$array首成员的值,然后将[0]按照原样输出,最后的结果就是a[0]了。

2.2 读取所有

@*是数组的特殊索引,表示返回数组的所有成员。

foo=(a b c d e f)
echo ${foo[@]}

效果如下:

image.png

这两个特殊索引配合for循环,就可以用来遍历数组。

for i in "${names[@]}"; do
  echo $i
done

同时要注意,@*放不放在双引号之中,是有差别的。

activities=( swimming "water skiing" canoeing "white-water rafting" surfing )
for act in ${activities[@]}; do
	echo "Activity: $act";
done

上面的例子中,数组activities实际包含5个成员,但是for...in循环直接遍历${activities[@]},导致返回7个结果,它会将字符串按空格分割:

image.png

为了避免这种情况,一般把${activities[@]}放在双引号之中。

for act in "${activities[@]}"; do
	echo "Activity: $act";
done

上面例子中,${activities[@]}放在双引号之中,遍历就会返回正确的结果:

image.png

而对于符号*来说,${activities[*]}不放在双引号之中,跟${activities[@]}不放在双引号之中是一样的。

可一旦将${activities[*]}放在双引号之中,所有成员就会变成单个字符串返回。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux