shell中数组的使用
shell中包含多个元素的变量称为数组,类似Python中的列表和字典。
在shell中没有字典或者java中的映射。但是可以通过关联数组的方法实现相同的功能。
1、索引数组/普通数组/列表
定义一个数组,有2种方法,简单使用和标准使用2种方法
简单使用
定义和使用较为简单,但是无法定义使用包含空格的元素。
要点如下:
- 数组整体用单引号或双引号包裹。
- 元素之间用空格分开
- 调用元素可以通过$var-name 的方式实现
- 简单使用只能遍历元素,无法单独调用1个或多个。
示例如下:
[root@k8s01 study-shell]# cat 01-lst.sh
#!/bin/bash
a="a b c"
for i in $a
do
echo $i
done
[root@k8s01 study-shell]# bash 01-lst.sh
a
b
c
[root@k8s01 study-shell]#
标准使用
标准使用方法通用性强,但是书写较为麻烦,但是为了避免不必要的问题,推荐使用标准方法
要点如下:
- 数组整体用小括号包裹
- 元素之间用空格或换行分割,多个连续空格或换行视为1个
- 每个元素用单引号或双引号包裹,特殊的无空格的元素可以不包裹,但仍推荐包裹
- 调用时需要用双引号包裹
示例如下:
-
遍历数组元素
[root@k8s01 study-shell]# cat 02-lst.sh #!/bin/bash a=(a a "b b" 'c c') for i in "${a[@]}" do echo $i done [root@k8s01 study-shell]# bash 02-lst.sh a a b b c c [root@k8s01 study-shell]#
-
调用单个元素
单个调用使用下标号调用,第一个元素下标为0,依次类推,最后一个元素下标为-1,依次类推
示例如下:
[root@k8s01 study-shell]# cat 05-lst.sh #!/bin/bash a=( a1 a2 "b b" 'c c' 'd d' ) echo "${a[1]}" echo "${a[-1]}" [root@k8s01 study-shell]# bash 05-lst.sh a2 d d [root@k8s01 study-shell]#
-
获取数组长度
数组长度通过#符号获取
示例如下
[root@k8s01 study-shell]# cat 06-lst.sh #!/bin/bash a=( a1 a2 "b b" 'c c' 'd d' ) echo "array lenth is ${#a[@]}" [root@k8s01 study-shell]# bash 06-lst.sh array lenth is 5 [root@k8s01 study-shell]#
-
数组切片
如果选取连续多个元素称为数组切片,格式为${array-name[@]:start_index:length}
示例如下
[root@k8s01 study-shell]# cat 07.lst.sh #!/bin/bash a=( a1 a2 "b b" 'c c' 'd d' ) echo "${a[@]:1:2}" for i in "${a[@]:1:2}" do echo $i done [root@k8s01 study-shell]# bash 07.lst.sh a2 b b a2 b b [root@k8s01 study-shell]#
-
删除元素
删除元素的格式为:unset array-name[index]
[root@k8s01 study-shell]# cat 08.lst.sh #!/bin/bash a=( a1 a2 "b b" 'c c' 'd d' ) # 删除下标为1的元素 unset a[1] for i in "${a[@]}" do echo $i done [root@k8s01 study-shell]# bash 08.lst.sh a1 b b c c d d [root@k8s01 study-shell]#
-
增加元素
增加元素类似于将后面的数组元素增加到前面的数组中,用符号+=实现,格式为array-name+=("element1" "elemetn2"),注意要加入的内容要符合数组定义格式规范。
shell中数组原生只支持这种末尾增加,如果需要在前面或者中间增加,需要自己配合下标形成新的数组,然后覆盖使用
[root@k8s01 study-shell]# cat 10.lst.sh #!/bin/bash a=( a1 a2 "b b" 'c c' 'd d' ) a+=("e e" 'f f') for i in "${a[@]}" do echo $i done [root@k8s01 study-shell]# bash 10.lst.sh a1 a2 b b c c d d e e f f [root@k8s01 study-shell]#
2、关联数组/字典/映射
关联数组需要先声明,再使用,-A表示声明的是关联数组,格式如下
declare -A dict-name
基本定义与遍历
示例如下
[root@k8s01 study-shell]# cat 11.lst.sh
#!/bin/bash
# 定义一个关联数组
declare -A mydict
# 插入值
mydict['name']='Martin'
mydict['age']=18
# 遍历数组
for i in "${!aaa[@]}"
do
echo "${i}:${aaa[$i]}"
done
[root@k8s01 study-shell]# bash 11.lst.sh
name:Martin
age:18
[root@k8s01 study-shell]#
也可以用键值对的形式给关联数组赋值
示例如下
[root@k8s01 study-shell]# cat 11.lst.sh
#!/bin/bash
# 定义一个关联数组
declare -A aaa
# 插入值
aaa=(
['name']='martin'
['age']=18
)
for i in "${!aaa[@]}"
do
echo "${i}:${aaa[$i]}"
done
[root@k8s01 study-shell]# bash 11.lst.sh
name:martin
age:18
[root@k8s01 study-shell]#
关联数组合并
关联数组合并没有原生的命令,可以通过将后一个数组的键值一一添加进前一个数组中实现
示例如下:
[root@k8s01 study-shell]# cat 12.lst.sh
#!/bin/bash
# 定义一个关联数组
declare -A aaa
declare -A bbb
# 插入值
aaa=(
['name']='martin'
['age']=18
)
bbb=(
['sex']='male'
)
for i in "${!bbb[@]}"
do
aaa[${i}]="${bbb[${i}]}"
done
for i in "${!aaa[@]}"
do
echo "${i}:${aaa[$i]}"
done
[root@k8s01 study-shell]# bash 12.lst.sh
name:martin
age:18
sex:male
[root@k8s01 study-shell]#