首页 > 编程笔记 > Linux命令 阅读:8

Shell数组的用法(非常详细)

和其他编程语言一样,Shell 也支持数组(Array),数组是若干数据的集合,在一个数组中的每一个数据称为元素(Element)。

Shell 中的数组有一个优点,那就是不会限制大小,理论上,只要空间足够大,数组可以存放无限量的数据。

想获取数组中的元素,要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式。但需要注意的是,Shell 数组元素的下标从 0 开始计数,下标必须大于等于 0。

在 Shell 中定义一个数组,需要用括号( )来表示,数组的元素与元素之间用空格分隔。一般定义一个数组的格式如下:
array_name=(ele1 ele2 ele3 … elen)
赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

【实例】定义一个数组。
[root@linux ~]# nums=(29 100 13 8 91 44)
这样一个简单的数组就定义完成了,nums 是数组名,括号中的这些数据就是数组的元素。这里要特别说明一下,Shell 属于弱类型语言,所以它并不会要求数组中元素的数据类型相同。

例如,在一个数组中有两个整数、一个字符串,这是没有问题的,不要求数组中全都是整数或全都是字符串。示例如下:
[root@linux ~]# nums=(29 "c.biancheng.net" 13)

在 Shell 中定义的数组不会限制大小,因此数组的长度也不是固定的,定义好一个数组之后,还可以再向里面增加新的元素。示例如下:
[root@linux ~]# nums=(29 100 13 8 91 44)
[root@linux ~]# nums[6]=88  #往数组中添加新的元素
这样该数组的长度就从 6 扩展到 7 了,这是在现有的数组上增加新的元素,也可以理解为给数组赋值。

除此之外,给数组赋值的时候也可以只给特定的元素赋值,例如,
[root@linux ~]# nums=([3]=29 [5]=100 [10]=13)
按照这种方式对第 3、5、10 个元素赋值,因为在这个数组中有 3 个元素有值,所以数组的长度是 3。

获取数组元素的值一般使用如下格式:
${array_name[index]}
其中,array_name 是数组名,index 是下标。

【实例】获取数组中元素的值。
[root@linux ~]# nums=(29 100 13 8 91 44)
[root@linux ~]# echo ${nums[0]}  # 获取数组 nums 的第 0 个元素的值
29
[root@linux ~]# echo ${nums[1]}  # 获取数组 nums 的第 1 个元素的值
100
[root@linux ~]# echo ${nums[2]}  # 获取数组 nums 的第 2 个元素的值
13
[root@linux ~]# echo ${nums[6]}  # 获取数组 nums 的第 6 个元素的值
44
[root@linux ~]# echo ${nums[7]}  # 获取数组 nums 的第 7 个元素的值

[root@linux ~]# ages=([3]=24 [5]=19 [10]=12)
[root@linux ~]# echo ${ages[3]}  # 获取数组 ages 的第 3 个元素的值
24
[root@linux ~]# echo ${ages[5]}  # 获取数组 ages 的第 5 个元素的值
19
[root@linux ~]# echo ${ages[10]}  # 获取数组 ages 的第 10 个元素的值
12
[root@linux ~]# echo ${ages[2]}  # 获取数组 ages 的第 2 个元素的值
通过案例可以明显看出,若赋值时不定义元素的位置,那么数组的下标就从 0 开始往上递加;若赋值时定义元素的位置,那元素将存放进数组特定的位置中,在获取其元素时,也需要指定特定的下标才可以。

那么,想一次性获取数组中的所有元素可以做到吗?可以的,使用“@”或“*”可以获取数组中的所有元素,两者之间没什么区别,用法如下:
${nums[*]}
${nums[@]}
【实例】使用“*”和“@”获取数组中的所有元素。
[root@linux ~]# nums=(29 100 13 8 91 44)
[root@linux ~]# echo ${nums[*]}
29 100 13 8 91 44
[root@linux ~]# echo ${nums[@]}
29 100 13 8 91 444

想要将数组中的某个元素赋值给变量可以做到吗?也是可以的,这样就与 Shell 变量结合起来了。

【实例】将数组中元素赋值给变量。
[root@linux ~]# nums=(29 100 13 8 91 44)  # 定义一个数组
[root@linux ~]# n=${nums[1]}  # 将数组的第一个元素赋值给变量 n
[root@linux ~]# echo $n  # 输出变量 n 的值
100

获取数组长度的操作在实际的企业工作中会经常用到,那怎么获取一个数组的长度呢?

先回顾一下,获取字符串的格式是${#str},示例如下:
[root@linux opt]# vim demo15
#!/bin/bash
str="https://c.biancheng.net/shell/"
echo "字符串长度:" ${#str}
[root@linux opt]# bash demo15
字符串长度: 30

获取数组的长度也大同小异,语法格式有以下两种:
${#array_name[@]}
${#array_name[*]}
array_name 表示数组名,先用“@”或者“*”获取数组的所有元素,再使用“#”获取整个数组元素的个数。

示例如下:
[root@linux opt]# nums=(29 100 13 8 91 44)
[root@linux opt]# echo ${#nums[*]}
6
[root@linux opt]# echo ${#nums[@]}
6

大家试想一下,如果数组中有个元素是字符串,那想获取这个字符串的长度可以做到吗?答案是可以。

【实例】获取数组中字符串的长度。
[root@linux opt]# nums=(29 "https://c.biancheng.net" 1333 8 91 44)
[root@linux opt]# echo ${#nums[0]}    #获取数组中第 0 个元素的长度
2
[root@linux opt]# echo ${#nums[1]}    #获取数组中第 1 个元素的长度,第一个元素是字符串
23

我们知道字符串可以拼接,其实 Shell 数组也是可以拼接和合并的,操作方式也非常简单。用“@”或“*”将数组扩展成列表,再合并到一起。格式如下:
array_new=(${array1[@]}${array2[@]})
array_new=(${array1[*]}${array2[*]})
两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接合并后形成的新数组。

【实例】拼接两个数组(4 种写法)。
[root@linux opt]# vim demo16
#!/bin/bash
array1=(2222 3333)
array2=(666 "https://c.biancheng.net")
array_new1=(${array1[@]} ${array2[@]})
array_new2=(${array1[*]} ${array2[*]})
array_new3=(${array1[@]} ${array2[*]})
array_new4=(${array1[*]} ${array2[@]})

echo ${array_new1[@]}    #也可以写作 ${array_new[*]}
echo ${array_new2[@]}
echo ${array_new3[@]}
echo ${array_new4[@]}

[root@linux opt]# bash demo16    #执行此脚本
2222 3333 666 https://c.biancheng.net
2222 3333 666 https://c.biancheng.net
2222 3333 666 https://c.biancheng.net
2222 3333 666 https://c.biancheng.net
可以看到,4 种写法的结果全都一致,所以“*”和“@”的位置不用特别在意,任意组合都可以。

最后再介绍一下如何删除数组中的元素,在 Shell 中,使用 unset 关键字来删除数组元素,语法格式如下:
unset array_name[index]
其中,array_name 表示数组名,index 表示数组下标。若不写下标,则去掉 [index] 部分,格式如下:
unset array_name
使用这种方式就是删除整个数组,数组中的所有元素也都会随之消失。

【实例】删除数组中的元素。
[root@linux opt]# vim demo17
#!/bin/bash
arr=(23 56 99 "https://c.biancheng.net")
echo "arr 数组的所有元素:" ${arr[@]}
unset arr[1]
echo "删除数组 arr 的第一个元素:" ${arr[@]}
unset arr
echo "删除整个数组:" ${arr[*]}

[root@linux opt]# bash demo17    #执行此脚本
arr 数组的所有元素: 23 56 99 https://c.biancheng.net
删除数组 arr 的第一个元素: 23 99 https://c.biancheng.net
删除整个数组:
注意最后的空行,它表示什么也没输出,因为数组被删除了,所以输出内容为空。

相关文章