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

数组操作

  1. 访问数组元素

使用通用的下标读取方式:

${array_name[index]}

如:

my_array=("X" "Y" "Z")  

echo "第一个元素为: ${my_array[0]}"  
  1. 使用 @ 或 * 可以获取数组中的所有元素,例如:
my_array=("X" "Y" "Z") 
echo "数组元素: ${my_array[*]}" 
echo "数组元素: ${my_array[@]}"  

输出结果:

数组的元素为: x y z
数组的元素为: x y z
  1. 获取数组的长度

获取数组长度的方法:${#变量},与获取字符串长度相同,当然这里数组的变量指的是数组所有元素. 示例:

arr=(2 4 5)
echo "数组arr长度:${#arr[*]}"
echo "数组arr长度:${#arr[@]}"
  1. 数组切片

切片即截取数组的其中一部分元素,格式:${数组名[*]:起始下标:数量}. 示例:

[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.

  1. 字典的声明与初始化:
declare -A dict_name
dict_name(["key1"]="value1" ["key2"]="value2" ... ["keyN"]="valueN")


declare -A dict2
dict2["key1"]="value1"  #设置或修改键
dict2["key2"]="value2"
  1. 访问字典元素
declare -A dict3
dict3["key1"]="value1"
dict3["key2"]="value2"

# 通过元素键来访问单个元素
echo ${dict3["key1"]}

# 获取字典所有键值: value1 value2
echo "字典元素值列表: ${dict3[*]}"
# 或者
echo "字典元素值列表: ${dict3[@]}"

# 获取字典所有键: key1 key2
echo "字典所有键: ${!dict3[*]}"

# 获取字典长度
echo "字典长度: ${#dict3[*]}"
  1. 判断键是否存在
if [ -v dict3["key"] ]
then
   echo "key1 in dict2"
fi
  1. 遍历字典
declare -A dict3
dict3=(["key1"]="value1" ["key2"]="value2")
for key in ${!dict3[*]}
do
   echo -e "$key : ${dict3[$key]} \n"
done

#输出结果:
key2 : value2 

key1 : value1