Bash支持一维数组,索引从0开始。索引可以不连续。
分为两种:
普通数组:索引是数字。
关联数组:索引是字符串。
行文风格:语法演示分为 语法规则 和实操演示 两部分。
1. 数组的创建与删除
语法
# 创建数组
# 方式一
declare -a name
# 方式二
name[index]=value
# 删除数组
unset name
# 查看数组
echo ${name[@]}
演示
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 创建数组:方式一
[root@dxy-node01 ~]# declare -a arr_a
[root@dxy-node01 ~]# # 1. 创建数组:方式二
[root@dxy-node01 ~]# arr_b[0]=1
[root@dxy-node01 ~]# echo ${arr_a[@]}
[root@dxy-node01 ~]# echo ${arr_b[@]}
1
[root@dxy-node01 ~]# # 2. 删除数组
[root@dxy-node01 ~]# unset arr_a
[root@dxy-node01 ~]# unset arr_b
[root@dxy-node01 ~]# echo ${arr_a[@]}
[root@dxy-node01 ~]# echo ${arr_b[@]}
[root@dxy-node01 ~]#
2. 元素的赋值与删除
语法
# 向数组赋值的三种方式
name[index]=value
name=(value1 value2 ...)
name=([0]=value1 [1]=value2 ...)
# 删除元素
unset "name[index]"
演示
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 声明数组和赋值
[root@dxy-node01 ~]# arr_a[0]=1
[root@dxy-node01 ~]# arr_b=(A B C)
[root@dxy-node01 ~]# arr_c=([0]=a [2]=b [3]=c)
[root@dxy-node01 ~]# # 1. 查看
[root@dxy-node01 ~]# echo ${arr_a[@]}
1
[root@dxy-node01 ~]# echo ${arr_b[@]}
A B C
[root@dxy-node01 ~]# echo ${arr_c[@]}
a b c
[root@dxy-node01 ~]# # 2. 删除元素
[root@dxy-node01 ~]# unset "arr_a[0]"
[root@dxy-node01 ~]# unset "arr_b[0]"
[root@dxy-node01 ~]# unset "arr_c[0]"
[root@dxy-node01 ~]# # 3. 再次查看
[root@dxy-node01 ~]# echo ${arr_a[@]}
[root@dxy-node01 ~]# echo ${arr_b[@]}
B C
[root@dxy-node01 ~]# echo ${arr_c[@]}
b c
[root@dxy-node01 ~]#
3. 元素的追加与更新
语法
# 末尾追加元素
name+=(value)
# 更新或添加元素
name[index]=value
演示
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 初始化一个数组
[root@dxy-node01 ~]# arr_a=([0]=a [1]=b [2]=c)
[root@dxy-node01 ~]# echo ${arr_a[@]}
a b c
[root@dxy-node01 ~]# # 2. 更新元素值
[root@dxy-node01 ~]# arr_a[0]=A
[root@dxy-node01 ~]# echo ${arr_a[@]}
A b c
[root@dxy-node01 ~]# # 3. 末尾追加元素
[root@dxy-node01 ~]# arr_a+=(d)
[root@dxy-node01 ~]# echo ${arr_a[@]}
A b c d
[root@dxy-node01 ~]# # 查看非空索引
[root@dxy-node01 ~]# for i in "${!arr_a[*]}"; do echo $i; done
0 1 2 3
[root@dxy-node01 ~]# # 4. 指定index添加元素
[root@dxy-node01 ~]# arr_a[99]=Z
[root@dxy-node01 ~]# echo ${arr_a[@]}
A b c d Z
[root@dxy-node01 ~]# # 5. 末尾追加元素
[root@dxy-node01 ~]# arr_a+=(d)
[root@dxy-node01 ~]# echo ${arr_a[@]}
A b c d Z d
[root@dxy-node01 ~]# # 查看非空索引
[root@dxy-node01 ~]# for i in "${!arr_a[*]}"; do echo $i; done
0 1 2 3 99 100
[root@dxy-node01 ~]# unset arr_a
[root@dxy-node01 ~]#
4. 查看数组长度和元素长度
语法
# 数组长度,即元素个数。
${#name[@]}
# 元素长度
${#name[index]} # 打印指定元素值的长度。(在shell中,只有index被赋值,才存在。)
演示
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 初始化数组
[root@dxy-node01 ~]# arr_a=(a bb ccc dddd)
[root@dxy-node01 ~]# # 1. 查看数组长度
[root@dxy-node01 ~]# echo "${#arr_a[@]}"
4
[root@dxy-node01 ~]# # 2. 查看指定元素长度
[root@dxy-node01 ~]# echo "${#arr_a[3]}"
4
[root@dxy-node01 ~]#
5. 遍历数组
语法
# 输出元素,空格切分元素
for i in ${name[*]}; do echo $i; done
for i in ${name[@]}; do echo $i; done
# 输出元素,不切割元素,不换行
for i in "${name[*]}"; do echo $i; done
# 输出元素,不切割元素,换行
for i in "${name[@]}"; do echo $i; done
# 输出非空索引值
for i in "${!name[@]}"; do echo $i; done
演示
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 声明数组
[root@dxy-node01 ~]# arr_a=("shan xi" "qin yuan" "shang hai" "pu dong")
[root@dxy-node01 ~]# echo ${arr_a[@]}
shan xi qin yuan shang hai pu dong
[root@dxy-node01 ~]# # 1.输出元素,空格切分元素,换行
[root@dxy-node01 ~]# for i in ${arr_a[*]}; do echo $i; done
shan
xi
qin
yuan
shang
hai
pu
dong
[root@dxy-node01 ~]# for i in ${arr_a[@]}; do echo $i; done
shan
xi
qin
yuan
shang
hai
pu
dong
[root@dxy-node01 ~]# # 2.输出元素,不切割元素
[root@dxy-node01 ~]# for i in "${arr_a[*]}"; do echo $i; done
shan xi qin yuan shang hai pu dong
[root@dxy-node01 ~]# for i in "${arr_a[@]}"; do echo $i; done
shan xi
qin yuan
shang hai
pu dong
[root@dxy-node01 ~]# # 3.输出非空索引值
[root@dxy-node01 ~]# for i in "${!arr_a[@]}"; do echo $i; done
0
1
2
3
[root@dxy-node01 ~]#
6. 元素排序
Base 原生不支持数组排序,我们借助管道,将原数组排序后分配给新数组。
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 声明数组
[root@dxy-node01 ~]# arr_a=(9 1 6 3 8 3 7)
[root@dxy-node01 ~]# echo ${arr_a[@]}
9 1 6 3 8 3 7
[root@dxy-node01 ~]# # 1.排序
[root@dxy-node01 ~]# arr_a=($( for i in "${arr_a[@]}"; do echo $i; done | sort ))
[root@dxy-node01 ~]# echo ${arr_a[@]}
1 3 3 6 7 8 9
[root@dxy-node01 ~]#
7. 关联数组
语法
# 声明数组
declare -A name
其他语法等同于 索引数组
演示
[root@dxy-node01 ~]#
[root@dxy-node01 ~]# # 0. 声明数组
[root@dxy-node01 ~]# declare -A base_info
[root@dxy-node01 ~]# base_info["name"]="DXY"
[root@dxy-node01 ~]# base_info["age"]="18"
[root@dxy-node01 ~]# base_info["gender"]="men"
[root@dxy-node01 ~]# # 1. 查看数组
[root@dxy-node01 ~]# echo ${base_info[@]}
men DXY 18
[root@dxy-node01 ~]# # 2. 打印非空索引
[root@dxy-node01 ~]# for i in "${!base_info[@]}"; do echo $i; done
gender
name
age
[root@dxy-node01 ~]#
行文结束,持续迭代。