Linux技能卡—数组


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 ~]# 


行文结束,持续迭代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值