(十一)数组array

变量:只能存一个值,数组可以存多个值

(1)普通数组,索引下标是整数:

1)定义:

方法一:一次赋一个值;语法:数组名[下标]=变量值
array[1]=linux
array[2]=shell
方法二:一次赋多个值;数组名=(变量值1 变量值2)
arrar1=(linux shell awk openstack [20]=docker)

2)引用:获取数组索引变量

语法:echo ${数组名[索引]}
echo ${books[3]}

(2)关联数组,索引下标是字符串:

1)定义关联数组:

语法:declare -A 数组名; 数组名=([索引]=变量值)

declare -A info1
info1=([name]=jack [sex]=male [age]=28 [height]=170 [skill]=cloud)   #info1是数组名,[name]:是数组索引下标; jack是数组元素

(3)访问数组元素:

访问数组中的元素:echo ${数组名[索引]}; echo ${info1[name]}
访问数组中的所有元素:echo ${数组名[@]} 等同于echo ${数组名[*]}
统计数组的元素的个数:echo ${#数组名[@]}
获取数组的索引:echo ${!数组名[@]} #非常重要

(4)遍历数组:通过数组索引遍历元素;把要统计的对象作为数组的索引

  • 例1:遍历数组:while方式
#!/bin/bash
while read line
do
        hosts[i++]=$line
done </etc/hosts
#遍历数组
for i in ${!hosts[@]}
do
        echo "$i:${hosts[$i]}"
done
  • 例2:遍历数组,for循环
#!/bin/bash
old_IFS=$IFS
IFS=$'
'
for line in $(cat /etc/hosts)
do
        hosts[++i]=$line
done
for i in ${!hosts[@]}
do
        echo "$i:${hosts[$i]}"
done
IFS=$old_IFS
  • 例3:统计性别
#!/bin/bash
declare -A sex
while read line 
do
        type=$(echo $line|awk '{print $2}')
        let sex[$type]++
done <sex.txt
for i in  ${!sex[*]}
do
        echo "$i:${sex[$i]}"
done
# cat sex.txt 
jack01 m
jack02 f
jack03 m
jack04 f
  • 例4:统计shell种类
#!/bin/bash
declare -A count
while read line 
do
        type=$(echo $line|awk -F ':' '{print $NF}')
        let count[$type]++
done </etc/passwd
for i in ${!count[@]}
do
        echo "$i: ${count[$i]}"
done
  • 例5:统计tcp连接状态数量
#!/bin/bash
while true
do
        unset tcp_count
        declare -A tcp_count
        type=$(ss -an | grep :80 | awk '{print $2}')
        for i in $type
        do
                let tcp_count[$i]++
        done
        for j in ${!tcp_count[@]}
        do
                echo "$j:${tcp_count[$j]}"
        done
        sleep 1
        clear
done
原文地址:https://www.cnblogs.com/lovelinux199075/p/8919309.html