在Shell中一个变量只能有一个值,但是通过定义数组变量可以赋予多个值,数组定义方式和变量基本一样。数组在工作中多用于做统计,思路就是把需要统计的字段放到索引中。Shell中的数组分为了普通数组和关联数字,普通数组的下标索引只能是数字,而关联数字可以自定义字符串。
一、数组的定义
1、普通数组
一次赋予多个值(元素)给数组的方式
IP=("192.168.100.10" "192.168.100.20" shell python) #定义一个包含4个值的数组,用空格分隔每个元素值
echo $IP #默认显示数组中第一个元素值
echo ${IP[1]} #数组中第一个元素值的索引为0,这里1代表显示第二个元素192.168.100.20,以此类推
echo ${IP[@]} #显示数组中的每个元素值
echo ${!IP[@]} #显示数组中的出每个索引下标
echo ${IP[*]} #也是显示数组中的所有元素
echo ${#IP} #显示第一个元素的字符个数
echo ${#IP[@]} #显示数组元素值的个数
还可以一次赋一个值给数组,方括号内就是索引下标:
array1[0]=python
array1[1]=php
array1[2]=shell
2、关联数组
关联数组的索引可以自定义为字符串,不再必须是整数,但是必须提前声明关联数组,否则Shell会把这个变量作为普通数组处理
dclare -A info #声明是关联数组,否则shell只认识普通数组
info=([name]=tom [age]=18 [sex]=male) #和普通数组定义方式有区别
echo ${info[name]}
二、数组使用示例
1、用数组统计不同shell的数量:
declare -A shells
while read line
do
type=`echo $line |awk -F: '{print $NF}'`
let shells[$type]++
done
for i in ${!shells[@]} #遍历索引
do
echo "$i: ${shells[$i]}"
done
2、统计TCP状态,比如看看有多少用户在请求我们的80端口:
declare -A status
type=`ss -an |grep :80 | awk '{print $2}'`
for i in $type
do
let status[$i]++
done
for j in ${!status[@]}
do
echo "$j: ${status[$j]}"
done