Shell数组的用法(非常详细)
和其他编程语言一样,Shell 也支持数组(Array),数组是若干数据的集合,在一个数组中的每一个数据称为元素(Element)。
Shell 中的数组有一个优点,那就是不会限制大小,理论上,只要空间足够大,数组可以存放无限量的数据。
想获取数组中的元素,要使用下标
在 Shell 中定义一个数组,需要用括号
【实例】定义一个数组。
例如,在一个数组中有两个整数、一个字符串,这是没有问题的,不要求数组中全都是整数或全都是字符串。示例如下:
在 Shell 中定义的数组不会限制大小,因此数组的长度也不是固定的,定义好一个数组之后,还可以再向里面增加新的元素。示例如下:
除此之外,给数组赋值的时候也可以只给特定的元素赋值,例如,
获取数组元素的值一般使用如下格式:
【实例】获取数组中元素的值。
那么,想一次性获取数组中的所有元素可以做到吗?可以的,使用“@”或“*”可以获取数组中的所有元素,两者之间没什么区别,用法如下:
想要将数组中的某个元素赋值给变量可以做到吗?也是可以的,这样就与 Shell 变量结合起来了。
【实例】将数组中元素赋值给变量。
获取数组长度的操作在实际的企业工作中会经常用到,那怎么获取一个数组的长度呢?
先回顾一下,获取字符串的格式是
获取数组的长度也大同小异,语法格式有以下两种:
示例如下:
大家试想一下,如果数组中有个元素是字符串,那想获取这个字符串的长度可以做到吗?答案是可以。
【实例】获取数组中字符串的长度。
我们知道字符串可以拼接,其实 Shell 数组也是可以拼接和合并的,操作方式也非常简单。用“@”或“*”将数组扩展成列表,再合并到一起。格式如下:
【实例】拼接两个数组(4 种写法)。
最后再介绍一下如何删除数组中的元素,在 Shell 中,使用 unset 关键字来删除数组元素,语法格式如下:
【实例】删除数组中的元素。
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 删除整个数组:注意最后的空行,它表示什么也没输出,因为数组被删除了,所以输出内容为空。