和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和C语言类似,Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
数组名=(值1 值2 ... 值n)
array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3)
或者:
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组中的各个元素:
array_name[0]=value0
array_name[1]=value1
......
array_name[n]=valuen
此外,你也无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:
ages=([3]=24 [5]=19 [10]=12)
以上代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。
字符串类型数组:同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。
rr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');
一、数组的操作
定义了数组之后就要开始使用了,首先就是读取。
1.读取数组元素
读取数组元素值的一般格式是:
${数组名[下标]}
${array_name[index]}
例如:
valuen=${array_name[n]}
n=${nums[2]}
表示获取 nums 数组的第二个元素,然后赋值给变量 n。再如:
echo ${nums[3]}
表示输出 nums 数组的第 3 个元素。
使用@或*可以获取数组中的所有元素,例如:
${nums[*]} ${nums[@]}
两者都可以得到 nums 数组的所有元素。
实例:
#!/bin/bash nums=(29 100 13 8 91 44) echo ${nums[@]} #输出所有数组元素 nums[10]=66 #给第10个元素赋值(此时会增加数组长度) echo ${nums[*]} #输出所有数组元素 echo ${nums[4]} #输出第4个元素
运行结果:
29 100 13 8 91 44
29 100 13 8 91 44 66
91
2.获取数组长度
所谓数组长度,就是数组元素的个数。
利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数,格式如下:
${#array_name[@]}
${#array_name[*]}
其中 array_name 表示数组名。两种形式是等价的,选择其一即可。
如果某个元素是字符串,还可以通过指定下标的方式获得该元素的长度,如下所示:
${#arr[2]}
获取 arr 数组的第 2 个元素(假设它是字符串)的长度。
回忆字符串长度的获取
回想一下 Shell 是如何获取字符串长度的呢?其实和获取数组长度如出一辙,它的格式如下:
${#string_name}
string_name 是字符串名。
实例:
#!/bin/bash nums=(29 100 13) echo ${#nums[*]} #向数组中添加元素 nums[10]="http://c.biancheng.net/shell/" echo ${#nums[@]} echo ${#nums[10]} #删除数组元素 unset nums[1] echo ${#nums[*]}
运行结果:
3
4
29
3
获取数组的下标:
length=${!array_name[@]}
#或
length=${!array_name[*]}
例如:
arr=(10 20 30 100 50 60) echo ${!arr[@]}
运行结果:
0 1 2 3 4 5
3.赋值
格式:数组名[下标]=值,如果下标不存在,则新增数组元素; 下标已有,则覆盖值
arr_number=(1 2 3 4 5);
这里需要提出两个问题:
第一个问题是如果该下标元素已经存在,会怎么样?
答:会修改该下标的值为新的指定值。
例如:arr_number[2]=100,数组被修改为(1 2 100 4 5)
第二个问题是如果指定的下标已经超过当前数组的大小,如上述的arr_number的大小为5,指定下标为10或者11或者大于5的任意值会如何?
答:新赋的值被追加到数组的尾部。
例如:arr_number[13]=13,数组被修改为(1 2 100 4 5 13)
4.分片访问
格式:${数组名[*或@]:开始下标:长度},截取部分数组,返回字符串,中间用空格分隔;将结果使用“()”,则得到新的切片数组
例如:
[root@10 ~]# arr2=(-1 2 3 4 5 6 7) [root@10 ~]# echo ${arr2[*]:0:3} -1 2 3 [root@10 ~]# arr3=(${arr2[*]:0:3}) #赋值给新的数组 [root@10 ~]# echo ${arr3[*]} -1 2 3
5.替换元素
格式:${数组名[*或@]/查找字符/替换字符}, 不会修改原数组;如需修改的数组,将结果使用“()”赋给新数组
例如:
[root@10 ~]# echo ${arr2[*]} -1 2 3 4 5 6 7 [root@10 ~]# echo ${arr2[*]/7/10} -1 2 3 4 5 6 10 [root@10 ~]# arr4=(${arr2[*]/7/10}) #赋值给新的数组 [root@10 ~]# echo ${arr4[*]} -1 2 3 4 5 6 10
6.数组拼接、合并
所谓 Shell 数组拼接(数组合并),就是将两个数组连接成一个数组。
拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。具体格式如下:
array_new=(${array1[@]} ${array2[@]}) array_new=(${array1[*]} ${array2[*]})
两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。
下面是完整的演示代码:
#!/bin/bash array1=(23 56) array2=(99 "http://c.biancheng.net/shell/") array_new=(${array1[@]} ${array2[*]}) echo ${array_new[@]} #也可以写作 ${array_new[*]}
运行结果:
23 56 99 http://c.biancheng.net/shell/
7.删除数组元素(也可以删除整个数组)
在 Shell 中,使用 unset 关键字来删除数组元素,具体格式如下:
unset array_name[index]
其中,array_name 表示数组名,index 表示数组下标。
如果不写下标,而是写成下面的形式:
unset array_name
那么就是删除整个数组,所有元素都会消失。
下面我们通过具体的代码来演示:
#!/bin/bash arr=(23 56 99 "http://c.biancheng.net/shell/") unset arr[1] echo ${arr[@]} unset arr echo ${arr[*]}
运行结果:
23 99 http://c.biancheng.net/shell/
空行
注意最后的空行,它表示什么也没输出,因为数组被删除了,所以输出为空。
8.数组遍历
arr=(1 2 3 4 5)
1)遍历(For循环法):
for var in ${arr[@]}; do echo $var done
运行结果:
1
2
3
4
5
2)遍历(带数组下标):
for i in "${!arr[@]}"; do printf "%s\t%s\n" "$i" "${arr[$i]}" done
运行结果:
01
12
23
34
45
3)遍历(While循环法):
j=0 while [ $j -lt ${#arr[@]} ] do echo ${arr[$j]} let j++ done
遍历(While循环法)使用 let "n++ "自增: 多了双引号,其实不用也可以
n=0 while [ $n -lt ${#arr[@]} ] do echo ${arr[$n]} let "n++" done
9.向函数传递数组
由于Shell对数组的支持并不号,所以这是一个比较麻烦的问题。
翻看了很多StackOverFlow的帖子,除了全局变量外,无完美解法。
这里提供一个变通的思路,我们可以在调用函数前,将数组转化为字符串。
在函数中,读取字符串,并且分为数组,达到目的。
例如:
fun() { local _arr=(`echo $1 | cut -d " " --output-delimiter=" " -f 1-`) local _n_arr=${#_arr[@]} for((i=0;i<$_n_arr;i++)); do elem=${_arr[$i]} echo "$i : $elem" done; } array=(a b c) fun "$(echo ${array[@]})"
运行结果:
0 : a
1 : b
2 : c
二、笔记
1.数组的值也可以写入变量。
例如:
A=1 my_array=($A B C D) echo "第一个元素为: ${my_array[0]}" echo "第二个元素为: ${my_array[1]}" echo "第三个元素为: ${my_array[2]}" echo "第四个元素为: ${my_array[3]}"
输出为:
第一个元素为: 1第二个元素为: B第三个元素为: c第四个元素为: D
2.根据数组元素索引获取该数组元素值时,数组下标可为变量。
例如:
arr=(a b c d) i=2 echo ${arr[i]}
输出为:
c
参考网址:
https://www.cnblogs.com/boshen-hzb/p/6249049.html
http://www.runoob.com/linux/linux-shell-array.html
http://c.biancheng.net/view/810.html
转载请注明: ITTXX.CN--分享互联网 » Shell&Shell脚本基础教程——数组
最后更新:2018-12-21 13:36:49