shell数组

本文遵循BY-SA版权协议,转载请附上原文出处链接。


本文作者: 黑伴白

本文链接: http://heibanbai.com.cn/posts/96117e1e/

shell数组

在编写shell脚本时,有些场景用数组还是比较方便的,下面进行下简单的介绍~

数组定义

数组中可以存放多个值,Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小

与大部分编程语言类似,数组元素的下标由0开始

Shell 数组用括号来表示,元素用”空格”符号分割开,语法格式如下:

1
Arr=(a b c d e)

shell是弱类型的,并不要求所有数组元素的类型必须相同

1
Arr=(1 2 "A" a c)

shell数组的长度不是固定的,定义之后还可以增加元素。例如,对于上面的Arr数组,它的长度是5,下面的代码会在最后增加一个元素,使其长度扩展到 7:

1
Arr[6]=666

此外,也无需逐个元素地给数组赋值,下面的就是只给特定元素赋值:

1
Arr=([2]=24 [9]=19 [11]=12)

以上就只给第2、9、11个元素赋值,所以数组长度是3

使用自定义分隔符定义数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
str="a,b,c,d,e,f"
#存储旧分隔符
OLD_IFS="$IFS"
#设置分隔符
IFS=","
#如下会自动分隔
Arr=($str)
#恢复原来的分隔符
IFS="$OLD_IFS"
#遍历数组
for item in ${Arr[@]}
do
echo "$item"
done

获取数组元素

获取数组元素的值,一般使用下面的格式,其中,array_name 是数组名,index 是下标:

${array_name[index]}

1
2
3
4
5
6
7
8
9
# 获取Arr数组的第二个元素,然后赋值给变量n
n=${Arr[2]}

# 输出Arr数组的第 个元素
echo ${Arr[3]}

# 使用@或*可以获取数组中的所有元素
echo "数组所有元素:${Arr[*]}"
echo "数组所有元素:${Arr[@]}"

获取数组长度

获取数组长度的方法与获取字符串长度的方法相同:

1
${#Arr[@]}

数组遍历

遍历1:标准for循环

1
2
3
4
for (( i=0;i<${#Arr[@]};i++ ))
do
echo ${Arr[i]}
done

遍历2:不带数组下标

1
2
3
4
for item in ${Arr[@]}
do
echo $item
done

遍历3:带数组下标

1
2
3
4
for i in "${!Arr[@]}"
do
printf "$s\t%s\n" "$i" "${Arr[$i]}"
done

遍历4:while循环

1
2
3
4
5
6
i=0
while [ $i -lt ${#Arr[@]} ]
do
echo ${Arr[$i]}
let i++
done

判断元素是否在数组中

方式1

1
2
3
if echo "${Arr[@]}" | grep -w "item" &>/dev/null; then
echo "存在"
fi

方式2

语法格式: [[ "${Arr[@]}" =~ "字符串" ]]

1
2
3
if [[ "${array[@]}" =~ "a" ]]; then
echo "存在"
fi

[[]]: 双中括号,这个结构是测试,测试[[]]之中的表达式

=~: 这个是正则表达式匹配,可用在[[]]测试中

数组删除操作

清除某个元素:unset Arr[1],这里清除下标为1的数组

清空整个数组:unset Arr

分片访问数组

分片访问形式为:${数组名[@或*]:开始下标:元素个数}

分片访问从下标为1开始,元素个数为4:${Arr[@]:1:4}

关联数组

shell支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。

关联数组使用declare命令来声明,语法格式如下:

1
declare -A array_name
  • -A选项就是用于声明一个关联数组

  • 关联数组的键是唯一的

1
declare -A site=(["google"]="www.google.com" ["baidu"]="www.baidu.com" ["taobao"]="www.taobao.com")

也可以先声明一个关联数组,然后再设置键和值:

1
2
3
4
declare -A site
site["google"]="www.google.com"
site["baidu"]="www.baidu.com"
site["taobao"]="www.taobao.com"

访问关联数组元素可以使用指定的键,格式如下:

1
array_name["index"]

通过键来访问关联数组的元素:

1
2
3
4
5
6
7
8
9
declare -A site
site["google"]="www.google.com"
site["baidu"]="www.baidu.com"
site["taobao"]="www.taobao.com"

echo ${site["baidu"]}

# 输出结果
www.baidu.com

蚂蚁再小也是肉🥩!


shell数组
http://heibanbai.com.cn/posts/96117e1e/
作者
黑伴白
发布于
2022年12月15日
许可协议

“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付