shell数组
Posted 棍子哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell数组相关的知识,希望对你有一定的参考价值。
数组
Shell 数组元素的下标也是从 0 开始计数。获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
常用的 Bash Shell 只支持一维数组,不支持多维数组。
Shell 数组的定义 在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为: array_name=(ele1 ele2 ele3 ... elen) 注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。 下面是一个定义数组的实例: nums=(29 100 13 8 91 44) Shell 是弱类型的,它并不要求所有数组元素的类型必须相同,例如: arr=(20 56 "http://c.biancheng.net/shell/") 第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。 Shell 数组的长度不是固定的,定义之后还可以增加元素。例如,对于上面的 nums 数组,它的长度是 6,使用下面的代码会在最后增加一个元素,使其长度扩展到 7: nums[6]=88 此外,你也无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值: ages=([3]=24 [5]=19 [10]=12) 以上代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。
获取数组元素 获取数组元素的值,一般使用下面的格式: ${array_name[index]} 其中,array_name 是数组名,index 是下标。例如: n=${nums[2]} 表示获取 nums 数组的第二个元素,然后赋值给变量 n。再如: echo ${nums[3]} 表示输出 nums 数组的第 3 个元素。 使用@或*可以获取数组中的所有元素,例如: ${nums[*]} ${nums[@]} 两者都可以得到 nums 数组的所有元素。
获取数组长度 所谓数组长度,就是数组元素的个数。 利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数,格式如下: ${#array_name[@]} ${#array_name[*]} 其中 array_name 表示数组名。两种形式是等价的,选择其一即可。 如果某个元素是字符串,还可以通过指定下标的方式获得该元素的长度,如下所示: ${#arr[2]} 获取 arr 数组的第 2 个元素(假设它是字符串)的长度。 回忆字符串长度的获取 回想一下 shell 是如何获取字符串长度的呢?其实和获取数组长度如出一辙,它的格式如下: ${#string_name} string_name 是字符串名。
shell 数组拼接合并 所谓 shell 数组拼接(数组合并),就是将两个数组连接成一个数组。 拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。具体格式如下: array_new=(${array1[@]} ${array2[@]}) array_new=(${array1[*]} ${array2[*]}) 两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。 下面是完整的演示代码: #!/bin/bash array1=(23 56) array2=(99 "http://www.beylze.com/d/file/20190908/1ix3hghjreu.html array_new=(${array1[@]} ${array2[*]}) echo ${array_new[@]} #也可以写作 ${array_new[*]} 运行结果: 23 56 99 http://www.beylze.com/d/file/20190908/wikbxcqy13l
删除数组元素
在 shell 中,使用 unset 关键字来删除数组元素,具体格式如下:
unset array_name[index]
其中,array_name 表示数组名,index 表示数组下标。
如果不写下标,而是写成下面的形式:
unset array_name
那么就是删除整个数组,所有元素都会消失。
关联数组也称为键值对(key-value)数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。 例如,我们可以创建一个叫做 color 的关联数组,并用颜色名字作为下标。 declare -A color color["red"]="#ff0000" color["green"]="#00ff00" color["blue"]="#0000ff" 也可以在定义的同时赋值: declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff") 不同于普通数组,关联数组必须使用带有-A选项的 declare 命令创建。 访问关联数组元素 访问关联数组元素的方式几乎与普通数组相同,具体形式为: array_name["index"] 例如: color["white"]="#ffffff" color["black"]="#000000" 加上$()即可获取数组元素的值: $(array_name["index"]) 例如: echo $(color["white"]) white=$(color["black"]) 获取所有元素的下标和值 使用下面的形式可以获得关联数组的所有元素值: ${array_name[@]} ${array_name[*]} 使用下面的形式可以获取关联数组的所有下标值: ${!array_name[@]} ${!array_name[*]} 获取关联数组长度 使用下面的形式可以获得关联数组的长度: ${#array_name[*]} ${#array_name[@]}
关联数组实例演示: #!/bin/bash declare -A color color["red"]="#ff0000" color["green"]="#00ff00" color["blue"]="#0000ff" color["white"]="#ffffff" color["black"]="#000000" #获取所有元素值 for value in ${color[*]} do echo $value done echo "****************" #获取所有元素下标(键) for key in ${!color[*]} do echo $key done echo "****************" #列出所有键值对 for key in ${!color[@]} do echo "${key} -> ${color[$key]}" done 运行结果: #ff0000 #0000ff #ffffff #000000 #00ff00 **************** red blue white black green **************** red -> #ff0000 blue -> #0000ff white -> #ffffff black -> #000000 green -> #00ff00 [root@snow zc]# declare -A color [root@snow zc]# color["red"]="#ff0000" [root@snow zc]# color["green"]="#00ff00" [root@snow zc]# color["blue"]="#0000ff" [root@snow zc]# echo ${color[@]} #ff0000 #0000ff #00ff00 [root@snow zc]# echo ${!color[@]} red blue green [root@snow zc]#