【shell脚本编写】shell 数组的使用
admin
2024-03-12 16:41:58

数组

  • shell基础-04 数组(定义数组、查看数组、访问数组、删除数组、关联数组、二维数组)

  • shell脚本之数组

  • 打印数组_shell数组和字典

速查

操作命令作用
创建数组declare -a array1=‘([2]=“zhangfei”)’逐个元素定义数组
array2=(sunquan zhouyu “lu su”)从列表定义数组 注意括号就相当于数组的定义
array3=(`cat /etc/user_name.txt`)从文件定义数组
array1+=(value1)
array1+=(value1,value2…valueN)
array1+=(${var1})
append【+=】方式创建数组,注意加括号()
删除unset array1[0]删除元素:unset 数组名[索引]
unset array1删除数组:unset 数组名
打印数组内容echo ${array1[@]}打印所有值
echo ${array1[0]}打印单个值
echo ${array1[@]:2:2}${数组名[@]:M:N} 打印多个值,打印下标M开始的N个元素
此处就是下标2开始的2个元素
echo ${#array1[@]}统计数组元数的个数
echo ${!array1[@]}获取数组的索引(也就是 key)
for i in “${array1[*]}”; do
echo $i;
done
遍历数组
数组追加元素array_name+=(value1…valueN)使用+=进行追加 常用!
array_name[index]=value直接使用下标进行元素的追加
array_name[${#array_name[@]}]=value将数组的长度作为下标进行追加元素 (因为数组下标从0开始,目前数组长度是无值的)
数组重新赋值array_name=(“${array_name[@]}” value1 …valueN)> 双引号不能省略,否则,当数组array name中存在包含空格的元素时会按空格将元素拆分成多个
> 不能将“@”替换为 “ * ”,如果替换为“ * ”,不加双引号时与"@"的表现一致,加双引号时,会将数组array name中的所有元素作为一个元素添加到数组中

数组创建与删除

# 1. 逐个元素定义数组
# 说明:不必从0开始定义,会自动按索引排序。
array1[3]=zhangfei
# declare -a 查看所有数组
# declare -a |grep array   查看刚定义的数组
declare -a array1='([2]="zhangfei")'# 2. 从列表定义数组  注意括号就相当于数组的定义
array2=(sunquan zhouyu "lu su")# 3. 从文件定义数组
array3=(`cat /etc/user_name.txt`)# 4. append【+=】方式创建数组,注意加括号()
array1+=(value1)
array1+=(value1,value2...valueN)
array1+=(${var1})# 5. 删除元素
# 删除元素:unset 数组名[索引]
unset array1[0]
# 删除数组:unset 数组名
unset array1

打印数组内容(数量,key 等)

访问数组中的单个元素:

  • 语法:${数组名[索引]}

访问数组中多个元素(切片):

  • 语法:${数组名[@]:M:N}
# 1. 打印所有值
echo ${array1[@]}
liubei guanyu zhangfei# 2. 打印单个值
echo ${array1[0]}
liubei# 3. 打印多个值,切片(数组下标也是从0开始,此处表示【打印从下标1开始2个元素(也就当前和后一个)】)
echo ${array1[@]:1:2}
guanyu zhangfei# 4. 统计数组元数的个数
echo ${#array1[@]}
3
# 注意:即使是从索引1开始取数,仍然会显示总数。测试如下:
echo ${#array1[@]:1}
3# 5. 获取数组的索引(也就是 key)
echo ${!array1[@]}
0 1 3# 6. 遍历数组
[root@localhost data]#for i in "${a[*]}"; do echo $i; done
5 3 45 99

数组追加元素

# 1. 方法一 :直接使用下标进行元素的追加
array_name[index]=value
# 2. 方法二:将数组的长度作为下标进行追加元素 (因为数组下标从0开始,目前数组长度是无值的)
array_name[${#array_name[@]}]=value
# 3. 方法三:重新赋值
> 双引号不能省略,否则,当数组array name中存在包含空格的元素时会按空格将元素拆分成多个
> 不能将“@”替换为 “ * ”,如果替换为“ * ”,不加双引号时与"@"的表现一致,加双引号时,会将数组array name中的所有元素作为一个元素添加到数组中
array_name=("${array_name[@]}" value1 ...valueN)
# 4. 方法四:使用+=进行追加 常用!
array_name+=(value1...valueN)

使用示例

#!/bin/bashecho "shell定义字典"
#必须先声明
declare -A dic
dic=([key1]="value1" [key2]="value2" [key3]="value3")#打印指定key的value
echo ${dic["key1"]}
#打印所有key值
echo ${!dic[*]}
#打印所有value
echo ${dic[*]}#遍历key值
for key in $(echo ${!dic[*]})
doecho "$key : ${dic[$key]}"
doneecho "shell定义数组"#数组
list=("value1" "value2" "value3")
#打印指定下标
echo ${list[1]}
#打印所有下标
echo ${!list[*]}
#打印数组下标
echo ${list[*]}
#数组增加一个元素
list=("${list[@]}" "value3")

误区注意

  • 数组不是单纯的数组,可以视为【字典】和【数组】的结合

    1. array1[3]=zhangfei 中的 【3】只能是视作 key,不具有排序作用
    2. array1+="test" 新增元素,并没有放到array1[4]位置,而是补齐之前的空位,补到了array1[0]
    3. 数组会自动对新加入的元素进行排序,会忽略空闲位置echo ${array1[@]:0:2},可以看到了打印对应的元素内容test zhangfei
  • append【+=】方式创建数组,注意加括号()

# 创建数组
$ array1[3]=zhangfei
# 查看刚创建的数组
$ declare -a | grep array
declare -a array1='([3]="zhangfei")'
# 可以到定义的 3 只是 key,与数组无关,数组会【自动排序】
$ echo ${array1[@]:1:2}
zhangfei
$ echo ${array1[@]:1:1}
zhangfei
# 数组新增元素
$ array1+="test"
# 可以看到新增的元素 被赋予一个 key  为 0 
$ declare -a | grep array
declare -a array1='([0]="test" [3]="zhangfei")'
# 查看数组的长度
$ echo ${#array1[@]}
2
# 查看数据的key  相当于查看 dict 的 key
$ echo ${!array1[@]}
0 3
# 可以看到 没找到新增的元素
$ echo ${array1[@]:1:1}
zhangfei
echo ${array1[@]:1:3}
zhangfei
# 查看数组位置  可以看到新增的元素 加到 0 位置
$ declare -a | grep array
declare -a array1='([0]="test" [3]="zhangfei")'
$ echo ${array1[@]:0:1}
test
$ echo ${array1[@]:0:2}
test zhangfei$ ip1=10.10.10.1
$ ip2=20.20.20.2
# 此处是直接 增添元素 创建数组
$ ips+=${ip1}
# 但查找不到
$ declare -a | grep ips
$ echo ${ips[@]}
10.10.10.1
$ ips+=${ip2}
# 同时打印全部  没有空格进行间隔
$ echo ${ips[@]}
10.10.10.120.20.20.2
# 可以看到全都存储在 key 为 0 中
$ echo ${ips[0]}
10.10.10.120.20.20.2
# 获取全部 key
$ echo ${!ips[@]}
0# 注意加括号
# 首先删除数组
$ unset ips
# 加括号方式创建
$ ips+=(${ip1})
$ ips+=(${ip2})
$ declare -a | grep ips
declare -a ips='([0]="10.10.10.1" [1]="20.20.20.2")'
$ echo ${!ips[@]}
0 1
$ echo ${ips[0]}
10.10.10.1

相关内容

热门资讯

上证指数ETF汇添富(5109... 1月14日,汇添富上证综合ETF(510980)收盘跌0.49%,成交额4970.63万元。上证指数...
深证50ETF易方达(1591... 1月14日,易方达深证50ETF(159150)收盘涨0.13%,成交额1974.34万元。深证50...
深证50ETF富国(15935... 1月14日,富国深证50ETF(159350)收盘涨0.46%,成交额9415.45万元。深证50E...
创业板200ETF富国(159... 1月14日,富国创业板中盘200ETF(159571)收盘涨1.71%,成交额201.98万元。创业...
紫金矿业股价连续4天上涨累计涨... 1月14日,紫金矿业涨0.68%,截至发稿,报38.50元/股,成交165.59亿元,换手率2.07...