Shell 数组和字典类型
数组定义
Bash Shell 支持一维数组,数组元素的下标由 0 开始。
数组定义语法格式如下:
# 方法一
array_name=(value0 value1 ... valuen)
# 方法二
array_name=([0=value1 [1]=value2...)
# 方法四
array_name[0]=value0
array_name[1]=value1
...
示例:
my_array1=(1 2 3 4)
my_array2=("a" "B" "d")
arr3[0]=30
arr3[1]=59
数组操作
- 访问数组元素
使用通用的下标读取方式:
${array_name[index]}
如:
my_array=("X" "Y" "Z")
echo "第一个元素为: ${my_array[0]}"
- 使用 @ 或 * 可以获取数组中的所有元素,例如:
my_array=("X" "Y" "Z")
echo "数组元素: ${my_array[*]}"
echo "数组元素: ${my_array[@]}"
输出结果:
数组的元素为: x y z
数组的元素为: x y z
- 获取数组的长度
获取数组长度的方法:${#变量},与获取字符串长度相同,当然这里数组的变量指的是数组所有元素. 示例:
arr=(2 4 5)
echo "数组arr长度:${#arr[*]}"
echo "数组arr长度:${#arr[@]}"
- 数组切片
切片即截取数组的其中一部分元素,格式:${数组名[*]:起始下标:数量}. 示例:
[oper@test96 ~]$ arr=(x y z w u)
[oper@test96 ~]$ echo ${arr[*]:1:2}
y z
[oper@test96 ~]$ echo ${arr[*]:2:10}
z w u
[oper@test96 ~]$ echo ${arr[*]:-12:10}
x y z w u
[oper@test96 ~]$ echo ${arr[*]:-1:10}
x y z w u
长度超过最大元素时只取到最大元素 起始下标负数时,从0开始
传递数组参数
向函数传递数组参数时,如果将数组变量作为参数传递,函数只会取到数组第一个元素,如下:
#!/bin/bash
test() {
echo "函数接收到的参数: $@"
newarr=($1)
echo "新数组的值为: ${newarr[@]}"
}
arr=(23 30 46 80)
echo "原数组值: ${arr[@]}"
test $arr
执行结果:
原始数组值:23 30 46 80
函数接收到的参数: 23
新数组的值为:23
正确的传递方式是: ${arr[@]}, 函数接收: ($@), 以上代码修改如下:
#!/bin/bash
test() {
echo "函数接收到的参数: $@"
newarr=($@)
echo "新数组的值为: ${newarr[@]}"
}
arr=(23 30 46 80)
echo "原数组值: ${arr[@]}"
test ${arr[@]}
字典类型
字典类型是一个由键值对组成的数组,即其他语言中的map.
- 字典的声明与初始化:
declare -A dict_name
dict_name(["key1"]="value1" ["key2"]="value2" ... ["keyN"]="valueN")
declare -A dict2
dict2["key1"]="value1" #设置或修改键
dict2["key2"]="value2"
- 访问字典元素
declare -A dict3
dict3["key1"]="value1"
dict3["key2"]="value2"
# 通过元素键来访问单个元素
echo ${dict3["key1"]}
# 获取字典所有键值: value1 value2
echo "字典元素值列表: ${dict3[*]}"
# 或者
echo "字典元素值列表: ${dict3[@]}"
# 获取字典所有键: key1 key2
echo "字典所有键: ${!dict3[*]}"
# 获取字典长度
echo "字典长度: ${#dict3[*]}"
- 判断键是否存在
if [ -v dict3["key"] ]
then
echo "key1 in dict2"
fi
- 遍历字典
declare -A dict3
dict3=(["key1"]="value1" ["key2"]="value2")
for key in ${!dict3[*]}
do
echo -e "$key : ${dict3[$key]} \n"
done
#输出结果:
key2 : value2
key1 : value1