shell array数组
1.普通数组
数组的定义有2种,一是一次赋一个值,二是一次赋多值,数组也是一种变量,具体赋值为:数组名[下标]=变量值
[klaus@localhost chapt6]$ array[0]=apple
[klaus@localhost chapt6]$ array[1]=banana
[klaus@localhost chapt6]$ echo "${array[1]}"
banana
[klaus@localhost chapt6]$ echo "${array[0]}"
apple
访问数组元素,array[@]表示所有元素,!array[@]表示数组的索引
[klaus@localhost chapt6]$ echo "${array[@]}"
apple banana
[klaus@localhost chapt6]$ echo "${!array[@]}"
0 1
同时数组也支持切片处理
[klaus@localhost chapt6]$ array[2]=pear
# 从数组下标1开始的2个数
[klaus@localhost chapt6]$ echo "${array[@]:1:2}"
banana pear
# 从数组下标0开始的数
[klaus@localhost chapt6]$ echo "${array[@]:0}"
apple banana pear
同时也可以支持多个赋值
[klaus@localhost chapt6]$ books=(linux shell docker awk openssh)
[klaus@localhost chapt6]$ echo "${books[1]}"
shell
[klaus@localhost chapt6]$ echo "${books[@]}"
linux shell docker awk openssh
[klaus@localhost chapt6]$ echo "${books[@]:2:1}"
docker
2.关联数组
关联数组和python中的dict有点像,使用之前需要declare,数组索引可以自定义
[klaus@localhost chapt6]$ declare -A info
[klaus@localhost chapt6]$ info=([name]=klaus [sex]=male [age]=23 [height]=178)
[klaus@localhost chapt6]$ echo "${info[name]}"
klaus
[klaus@localhost chapt6]$ echo "${info[sex]}"
male
[klaus@localhost chapt6]$ echo "${info[@]}"
klaus 178 23 male
[klaus@localhost chapt6]$ echo "${!info[@]}"
name height age sex
同时数组也可以跳过索引定义
[klaus@localhost chapt6]$ books=(linux shell docker awk openssh [30]=opencv)
[klaus@localhost chapt6]$ echo "${!books[@]}"
0 1 2 3 4 30
[klaus@localhost chapt6]$ echo "${books[@]}"
linux shell docker awk openssh opencv
3.实例
3.1 统计/etc/passwd每一行最后参数个数
[klaus@localhost chapt6]$ cat host.sh
#!/bin/bash
declare -A user
if [ $# -eq 0 ];then
echo "usage: `basename $0` file"
fi
if [ ! -f $1 ];then
echo "You entered is not a file!"
exit
else
while read line
do
type=`echo $line | awk -F " " '{print $NF}'`
let user[$type]++
done<$1
for i in ${!user[@]}
do
echo "$i: ${user[$i]}"
done
fi
[klaus@localhost chapt6]$ ./host.sh username.txt
male: 4
unknown: 1
female: 1
[klaus@localhost chapt6]$ cat username.txt
haha male
hehe female
heihei male
huhu male
diudiu male
biubiu unknown
3.2 统计tcp监听状态
[klaus@localhost chapt6]$ cat tcp_state.sh
#!/bin/bash
while true
do
declare -A status
type=`netstat -a|awk '/^tcp/'|awk '{print $NF}'`
for line in $type
do
let status[$line]++
done
for j in ${!status[@]}
do
echo "$j:${status[$j]}"
done
unset status # shell清空数组的特殊形式
# sleep 1
# clear
done
[klaus@localhost chapt6]$ ./tcp_state.sh
ESTABLISHED:2
LISTEN:6
ESTABLISHED:2