Shell编程——数组的相关操作(定义、拼接、求长度等)

本文介绍Shell脚本中数组的基本操作,包括定义、访问元素、获取长度、拼接、删除及关联数组的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

前言

(1)和其他编程语言一样,Shell 也支持数组,但仅支持一维数组而不支持多维数组,并且没有限定数组的大小。

(2)类似与C语言,数组元素的下标由0开始编号。

(3)获取数组中的元素要利用下标[ ],下标可以是整数或算术表达式,其值大于或等于0。 

一、数组的定义

(1)在Shell中用括号来表示数组,数组元素用“空格”符号分割开:

 array_name=(value1 ... valuen)

(2)Shell 是弱类型的,它并不要求所有数组元素的类型必须相同。下面例子中第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。

arr=(20 56 "http://c.biancheng.net/shell/")

(3)Shell 数组的长度不是固定的,定义之后还可以增加元素。例如,对于上面的arr数组,它的长度是 3,使用下面的代码会在最后增加一个元素,使其长度扩展到 4:

arr[3]="abcdedfg"

(4)此外可以只给特定元素赋值,无需逐个元素地给数组赋值。如下所示,以下代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。

ages=([3]=24 [5]=19 [10]=12)

二、获取某个数组元素

(1)读取数组元素值的一般格式如下,其中array_name 是数组名,index 是下标。

${array_name[index]}
xjh@ubuntu:~/iot/tmp$ cat test.sh 
#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
xjh@ubuntu:~/iot/tmp$ ./test.sh 
First Index: Zara
Second Index: Qadir
xjh@ubuntu:~/iot/tmp$

(2)使用@ 或 * 可以获取数组中的所有元素。

${array_name[*]}
${array_name[@]}
xjh@ubuntu:~/iot/tmp$ cat test.sh 
#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
NAME[10]="XJH"
echo "Second Method: ${NAME[@]}"
xjh@ubuntu:~/iot/tmp$ ./test.sh 
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy XJH
xjh@ubuntu:~/iot/tmp$ 

三、获取数组的长度

(1)所谓数组长度,就是数组元素的个数。

(2)获取数组长度的方法与获取字符串长度的方法相同,即首先利用@*将数组扩展成列表,然后使用#来获取数组元素的个数,格式如下:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

(3)实例演示

xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bash

nums=(29 100 13)
echo ${#nums[*]}

#向数组中添加元素
nums[10]="http://c.biancheng.net/shell/" #一共有29个字符
echo ${#nums[@]}
echo ${#nums[10]}

#删除数组元素
unset nums[1]
echo ${#nums[*]}
xjh@ubuntu:~/iot/tmp$ ./test.sh 
3
4
29
3
xjh@ubuntu:~/iot/tmp$ 

四、数组的拼接

(1)所谓 Shell 数组拼接(数组合并),就是将两个数组连接成一个数组。

(2)拼接数组的思路是:先利用@*,将数组扩展成列表,然后再合并到一起。具体格式如下:

array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]}

(3)实例演示

xjh@ubuntu:~/iot/tmp$ cat test.sh 
#!/bin/bash

array1=(23 56)
array2=(99 "http://c.biancheng.net/shell/")
array_new=(${array1[@]} ${array2[*]})

echo ${array_new[@]}  #也可以写作 ${array_new[*]}
xjh@ubuntu:~/iot/tmp$ ./test.sh 
23 56 99 http://c.biancheng.net/shell/
xjh@ubuntu:~/iot/tmp$

五、删除数组元素

(1)在 Shell 中,使用 unset 关键字来删除数组元素或者删除整个数组。如下所示,array_name 表示数组名,index 表示数组下标。

unset array_name[index] #删除数组中某个元素
unset array_name  #删除整个数组

(2)实例演示

xjh@ubuntu:~/iot/tmp$ cat test.sh 
#!/bin/bash

arr=(23 56 99 "http://c.biancheng.net/shell/")
unset arr[1]
echo ${arr[@]}

unset arr
echo ${arr[*]}
xjh@ubuntu:~/iot/tmp$ ./test.sh 
23 99 http://c.biancheng.net/shell/
    #注意到这里有一个空行,是因为删除了整个数组,所以输出为空
xjh@ubuntu:~/iot/tm

六、关联数组

(1)现在最新的 Bash Shell 已经支持关联数组了。关联数组使用字符串作为下标,而不是整数,这样可以做到见名知意。

(2)关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。

(3)例如,我们可以创建一个叫做 color 的关联数组,并用颜色名字作为下标。注意,关联数组必须使用带有-A选项的 declare 命令创建。

declare -A color
color["red"]="#ff0000"
color["green"]="#00ff00"
color["blue"]="#0000ff"

#或者在定义的同时赋值
declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff")

1、访问关联数组元素

访问关联数组元素的方式几乎与普通数组相同,具体形式为:

array_name["index"]
color["white"]="#ffffff"
color["black"]="#000000"

加上$()即可获取数组元素的值:

$(array_name["index"])
echo $(color["white"])
white=$(color["black"])

2、获取所有元素的下标和值

使用下面的形式可以获得关联数组的所有元素值:

${array_name[@]}
${array_name[*]}

使用下面的形式可以获取关联数组的所有下标值:

${!array_name[@]}
${!array_name[*]}

3、获取关联数组长度

${#array_name[*]}
${#array_name[@]}

4、实例演示

xjh@ubuntu:~/iot/tmp$ cat test.sh 
#!/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
xjh@ubuntu:~/iot/tmp$ ./test.sh 
#ff0000
#0000ff
#ffffff
#000000
#00ff00
****************
red
blue
white
black
green
****************
red -> #ff0000
blue -> #0000ff
white -> #ffffff
black -> #000000
green -> #00ff00
xjh@ubuntu:~/iot/tmp$ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值