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
:
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[@]}
效果如下:
这两个特殊索引配合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个结果,它会将字符串按空格分割:
为了避免这种情况,一般把${activities[@]}
放在双引号之中。
for act in "${activities[@]}"; do
echo "Activity: $act";
done
上面例子中,${activities[@]}
放在双引号之中,遍历就会返回正确的结果:
而对于符号*
来说,${activities[*]}
不放在双引号之中,跟${activities[@]}
不放在双引号之中是一样的。
可一旦将${activities[*]}
放在双引号之中,所有成员就会变成单个字符串返回。