普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引
一,普通数组
定义数组:
方法一: 一次赋一个值
数组名[下标]=变量值
array[1]=pear
array[2]=apple
array[3]=orange
方法二: 一次赋多个值
array2=(tom jack alice)
array3=(`cat /etc/passwd`) #将该文件中的每一行作为一个元数据赋值给数组array3
array4=(tom "bash shell" jack)
colors=($red $blue $green)
array5=(1 2 3 "linux shell" [20]=puppet)
二,关联数组
定义数组:
方法一: 一次赋一个值
数组名[ 索引名]=变量值
items[english]=100
items[chinese]=200
方法二:一次赋多个值
items=([english]=100 [chinese]=200 [africa]=300)
定义普通数组
[root@localhost shell]# books=(linux shell awk docker) #定义普通数组
[root@localhost shell]# echo ${books[1]} #根据索引获取值
shell
[root@localhost shell]# echo ${books[0]} #索引从0开始
linux
[root@localhost shell]# echo ${books[*]} #获取所有值
linux shell awk docker
[root@localhost shell]# echo ${!books[*]} #获取所有索引
0 1 2 3
[root@localhost shell]# echo ${books[@]:2} #从数组下标2开始
awk docker
[root@localhost shell]# echo ${books[@]:1:2} #从数组下标1开始,访问两个元素
shell awk
定义关联数组
[root@localhost shell]# declare -A items #申明关联数组
[root@localhost shell]# items=([english]=100 [chinese]=200 [africa]=300) #定义items数组内容
[root@localhost shell]# declare -A #查看定义是否成功
declare -A BASH_ALIASES='()'
declare -A BASH_CMDS='()'
declare -A items='([english]="100" [chinese]="200" [africa]="300" )'
[root@localhost shell]# echo ${items[@]} #查看items所有值
100 200 300
[root@localhost shell]# echo ${!items[@]} #查看数组所有索引
english chinese africa
[root@localhost shell]# echo ${#items[@]} #统计数组元素个数
3
[root@localhost shell]# echo ${items[english]} #查看某个索引的值
100
示例1:普通遍历
#!/usr/bin/bash
while read line
do
hosts[++i]=$line #普通数组赋值
done </etc/hosts
echo "hosts first: ${hosts[1]}"
for i in ${!hosts[@]} #数组遍历,i保存了数组的索引
do
echo "$i: ${hosts[i]}" # ${hosts[i]} 通过索引获取值
done
给普通数组赋值,再通过for循环来遍历数组的索引,通过索引获取数组的所有值。
示例2:实现性别统计
#!/usr/bin/bash
declare -A sex
while read line
do
type=`echo $line |awk '{print $2}'`
let sex[$type]++ #把需要统计的值当做数组的索引,并使用 sex[$type]++ 实现叠加
done < sex.txt
for i in ${!sex[@]} #通过索引获取值
do
echo "$i: ${sex[$i]}"
done
重点是使用 let sex[$type]++
把需要统计的值当做数组的索引
,并使用 sex[$type]++ 实现叠加
下面为实现索引值叠加的例子
shell> declare -A sexs
shell> sex=([m]=1 [f]=1)
shell> echo ${sexs[@]}
1 1
shell> echo ${!sexs[@]}
f m
shell> let sexs[m]++ #实现元素值叠加
shell> let sexs[f]++
shell> echo ${sexs[@]}
2 2
shell> echo ${!sexs[@]}
f m
示例3:统计不同shell数量
#!/usr/bin/bash
declare -A shells
while read line
do
type=`echo $line |awk -F":" '{print $NF}'`
let shells[$type]++
done < /etc/passwd
for i in ${!shells[@]}
do
echo "$i: ${shells[$i]}"
done
其实有更简单的方式来实现 这类统计操作
cat /etc/passwd |awk -F":" '{print $NF}' |sort -rn |uniq -c
cat /etc/passwd |awk -F":" '{print $NF}' |sort -rn |uniq -c |awk '{print $2,$1}' #实现$1,$2的位置互换
索引和值的关系
image.png