shell 数组(详细)

基本上所有的编程语言都支持数组,shell也不例外,shell数组的定义、赋值和引用数组元素的格式如下:

数组名=(元素1 元素2 元素3 ... 元素n)
数组名=([下标1]=值1 [下标2]=值2 ... [下标n]=值n)
数组名[下标]=值
${数组名[下标]}

编写一个脚本,定义一个数组,使用两种方式赋值,并打印数组元素的值:

#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[0]}
b=([0]=10 [1]=2 [5]=6)
echo ${b[0]}
echo ${b[8]}
a[0]=100
echo ${a[0]}

运行这个脚本:

root@pc:/home/demo# ./hello.sh 
1
10

100

遍历数组元素

可以使用for或while循环来遍历数组元素

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

a=(1 2 3 4 5 6)
for((i=0; i<10; i++))
do
    echo "a[$i]=${a[$i]}"
done


root@pc:/home/demo# ./hello.sh 
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
a[5]=6
a[6]=
a[7]=
a[8]=
a[9]=

还有一种更方便的方法,可以使用${a[*]}、\${a[@]}来遍历数组中的所有元素。

root@pc:/home/demo# cat hello.sh 
#!/bin/bash

a=(1 2 3 4 5 6)
echo ${a[*]}
echo ${a[@]}

root@pc:/home/demo# ./hello.sh 
1 2 3 4 5 6
1 2 3 4 5 6

数组长度

shell的数组长度即数组元素的个数。通过上面的脚本可以看到,当我们对数组越界访问时shell也不会报错。我们可以使用#来获取数组真正的长度:

#!/bin/bash

a=(1 2 3 4 5 6)

echo ${a[*]}
echo "a len: ${#a[*]}"

a[6]=7
echo ${a[@]}
echo "a len: ${#a[@]}"

我们可以先使用a[*]或a[@]获取数组的所有元素,然后使用#来获取元素的格式即可。上面的脚本的运行结果:

1 2 3 4 5 6
a len: 6
1 2 3 4 5 6 7
a len: 7

数组合并

shell支持将两个数组合并成一个新的数组,以下面的脚本为例,将数组a和数组b合并为一个新的数组c:

#!/bin/bash

a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${#a[*]}"

b=("hello" "zhaixue.cc")
echo ${b[@]}
echo "b len: ${#b[@]}"

c=(${a[*]} ${b[*]})
echo ${c[@]}
echo "c len: ${#c[@]}"

C语言的二维数组,二维数组的每一个数组元素是一个一位数组。shell数组也是类似,可以将一个shell数组作为新数组的一个元素,将达到了数组合并的效果了。脚本的运行结果如下:

root@pc:/home/demo# ./hello.sh 
1 2 3 4 5 6
a len: 6
hello zhaixue.cc
b len: 2
1 2 3 4 5 6 hello zhaixue.cc
c len: 8

删除数组元素

shell可以使用unset来删除一个数组元素,或者删除整个数组:

#!/bin/bash

a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${#a[*]}"

unset a[5]
echo ${a[*]}
echo "a len: ${#a[*]}"

unset a
echo ${a[*]}
echo "a len: ${#a[*]}"

脚本运行结果:

1 2 3 4 5 6
a len: 6
1 2 3 4 5
a len: 5

a len: 0
《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客