数组
数组介绍
什么是数组?
数组就是一系列元素的集合,一个数组内可以存放多个元素
为何要用数组?
我们可以用数组将多个元素汇总到一起,避免单独定义的麻烦
数组的使用
数组的定义
方式一:array=(元素1 元素2 元素3)
[root@m01 ~]# a=(nana 18 female)
方式二:array=([key1]=value1 [key2]=value2 [key3]=value3)
[root@m01 ~]# b=([0]=111 [1]="nana" [2]="biubiubiu")
方式三:依次赋值
[root@m01 ~]# c[0]=111
[root@m01 ~]# c[1]=666
[root@m01 ~]# c[2]="biubiubiu"
方式四:利用执行命令的结果设置数组元素:array=($(命令)) 或者 array=(`命令`)
该方式会将命令的结果以空格为分隔符切成多个元素然后赋值给数组
[root@m01 ~]# ls /root
anaconda-ks.cfg
[root@m01 ~]# arry=(`ls /root`)
[root@m01 ~]# declare -a | grep arry
declare -a arry='([0]="anaconda-ks.cfg")'
查看声明过的数组
[root@m01 ~]# declare -a
declare -a a='([0]="nana" [1]="18" [2]="female")'
declare -a b='([0]="111" [1]="nana" [2]="biubiubiu")'
declare -a c='([0]="111" [1]="666" [2]="biubiubiu")'
访问数组内的元素
[root@m01 ~]# arry=(nana 18 female)
1、按照索引访问数组内指定位置的元素
[root@m01 ~]# echo ${arry[0]}
nana
[root@m01 ~]# echo ${arry[1]}
18
[root@m01 ~]# echo ${arry[2]}
female
[root@m01 ~]# echo ${arry[-1]}
female
2、访问数组内全部元素信息
[root@m01 ~]# echo ${arry[*]}
nana 18 female
[root@m01 ~]# echo ${arry[@]}
nana 18 female
3、获取数组元素的长度
[root@m01 ~]# echo ${#arry[*]}
3
[root@m01 ~]# echo ${#arry[@]}
3
4. 获取普通数组元素的索引
[root@m01 ~]# a=(1 2 3 "a" "b" "c")
[root@m01 ~]# echo ${!a[@]}
0 1 2 3 4 5
修改/添加数组元素
[root@m01 ~]# arry=(nana 18 female)
[root@m01 ~]# declare -a | grep arry
declare -a arry='([0]="nana" [1]="18" [2]="female")'
[root@m01 ~]# arry[0]=lala
[root@m01 ~]# arry[1]=16
[root@m01 ~]# declare -a | grep arry
declare -a arry='([0]="lala" [1]="16" [2]="female")'
删除数组元素
[root@m01 ~]# unset arry[0]
[root@m01 ~]# declare -a | grep arry
declare -a arry='([1]="16" [2]="female")'
[root@m01 ~]# echo ${arry[*]}
16 female
[root@m01 ~]# unset arry 删除整个数组
[root@m01 ~]# echo ${arry[@]}
数组内元素的截取
[root@m01 ~]# a=(1 2 3 4 5 6 7)
[root@m01 ~]# echo ${a[*]:2} # 从索引1开始,一直到最后
3 4 5 6 7
[root@m01 ~]# echo ${a[*]:2:3} # 从索引1开始,访问3个元素
3 4 5
[root@m01 ~]# b=(one two three four five fire)
[root@m01 ~]# echo ${b[*]#one}
two three four five fire
[root@m01 ~]# echo ${b[*]#f*e}
one two three four
数组内容的替换
[root@m01 ~]# c=(one two three four five fire)
[root@m01 ~]# echo ${c[*]}
one two three four five fire
[root@m01 ~]# echo ${c[*]/five/abc}
one two three four abc fire
[root@m01 ~]# echo ${c[*]/f*e/abc}
one two three four abc abc
关联数组
数组分为两种
- 普通数组:只能使用整数作为数组索引,我们前面介绍的都是普通数组
- 关联数组:可以使用字符串作为数组索引,需要用declare -A声明
创建关联数组的格式
declare -A abc
声明关联数组
[root@m01 ~]# declare -A abc
[root@m01 ~]# abc=(["name"]="nana" ["age"]=18 ["gender"]="female")
[root@m01 ~]# echo ${abc["age"]}
18
[root@m01 ~]# echo ${abc["gender"]}
female
[root@m01 ~]# declare -A | grep abc
declare -A abc='([gender]="female" [name]="nana" [age]="18" )'
遍历数组
遍历普通数组
- for循环
#!/bin/bash
declare -a a=(nana 18 female)
for i in ${a[*]}
do
echo $i
done
[root@m01 ~]# bash abc.sh
nana
18
female
- while循环
#!/bin/bash
a=(nana 18 female)
num=${#a[*]} ${#a[*]},取数组元素的个数
i=0
while (( $i < $num ));
do
echo ${a[$i]}
let i++
done
遍历关联数组
遍历key值和遍历value值的差别
遍历key:${!array[*]}
遍历value:${array[*]}
- 遍历key
#!/bin/bash
declare -A array=(["name"]="nana" ["age"]=18 ["gender"]="female")
for i in ${!array[*]}
do
echo $i
done
[root@m01 ~]# bash a.sh
gender
name
age
- 遍历value
#!/bin/bash
declare -A array=(["name"]="nana" ["age"]=18 ["gender"]="female")
for i in ${array[*]}
do
echo $i
done
[root@m01 ~]# bash a.sh
female
nana
18
关联数组的属性
关联数组定义的数据,shell解释器会默认进行排序,如下所示:
1. 定义关联数组
[root@m01 ~]# declare -A array=(["name"]="nana" ["age"]=18 ["gender"]="female")
2. 查看关联数组
[root@m01 ~]# declare -A
declare -A array='([gender]="female" [name]="nana" [age]="18" )'