Shell阶段08 数组(普通数组, 关联数组), 示例(数组的遍历与循环)
#shell的数组用的比较少,一般都用awk。因为shell的数组比awk慢很多 什么是数组 简单来说: 数组其实就是变量的一种,变量只能存储一个值,而数组可以存储多个值 数组的分类 分为两类 普通数组 关联数组 普通数组: 只能使用正整数作为数组索引 关联数组: 可以使用字符串作为数组索引
普通数组
关联数组
#定义普通数组数组 #声明数组 declare -a 数组名 普通数组无需声明 #-a是普通数组 -A是关联数组 #第一种定义方式 [root@shell01 ~]# shuzu_1[0]=nginx [root@shell01 ~]# shuzu_1[1]=php-fpm [root@shell01 ~]# shuzu_1[2]=mysql #第二种定义方式,一次定义多个值 [root@shell01 ~]# shuzu_2=(oldboy oldgirl oldqiu) #第三种 通过命令的执行结果进行定义 默认以空白字符为分隔符 [root@shell01 ~]# shuzu_3=($(cat /etc/hosts)) #第四种 自定义索引序列号 [root@shell01 ~]# shuzu_4=(beijing shanghai [5]=wuhan [10]=nanjing) #访问数组中的内容 #打印数组中所有值 [root@shell01 ~]# echo ${shuzu_1[@]} #@表示所有 nginx php-fpm mysql [root@shell01 ~]# echo ${shuzu_1[*]} nginx php-fpm mysql #打印数组的所有索引 [root@shell01 ~]# echo ${!shuzu_1[@]} 0 1 2 [root@shell01 ~]# echo ${!shuzu_3[@]} 0 1 2 3 4 5 6 7 8 9 #打印数组的元数个数 索引的个数 [root@shell01 ~]# echo ${#shuzu_1[@]} 3 [root@shell01 ~]# echo ${#shuzu_4[@]} 4 [root@shell01 ~]# echo ${#shuzu_3[@]} 10 #显示定义的普通数组(这个数组不是永久生效的,退出登录就没了) [root@shell01 ~]# declare -a #取出数组中单个的值 [root@shell01 ~]# echo ${shuzu_1[0]} nginx #所有值中从索引几开始取,显示选中的 [root@shell01 ~]# echo ${shuzu_1[@]:1} php-fpm mysql [root@shell01 ~]# echo ${shuzu_1[@]:0} nginx php-fpm mysql #所有值从0开始取,一直到2,顾头不顾尾,和索引切片一样 [root@shell01 ~]# echo ${shuzu_1[@]:0:2} nginx php-fpm [root@shell01 ~]# echo ${shuzu_1[@]:0:3} nginx php-fpm mysql [root@shell01 ~]# url=www.sine.com.cn #参考索引欺骗 [root@shell01 ~]# echo ${url:1:5} ww.si
#删除数组
删除数组中的某元素,会导致稀疏格式
unset ARRAY[INDEX]
#删除整个数组
unset ARRAY
#向数组追加元素 (通过数组长度,直接加在最后一个上)
[root@ubuntu2204 ~]# num[${#num[@]}]=11
#关联数组 #定义关联数组,需要声明(不声明就不是关联数组) [root@shell01 ~]# declare -A shuzu_1 [root@shell01 ~]# declare -A shuzu_2 #第一种定义方式 [root@shell01 ~]# shuzu_1[name]=qiudao [root@shell01 ~]# shuzu_1[age]=18 [root@shell01 ~]# shuzu_1[skill]=linux #第二种定义方式 [root@shell01 ~]# shuzu_2=([index1]=nginx [index2]=mysql [index3]=php) #显示所有已定义的关联数组 [root@shell01 ~]# declare -A #如何访问关联数组里面的内容 #显示关联数组元数个数 [root@shell01 ~]# echo ${#shuzu_2[@]} 3 #显示所有索引 [root@shell01 ~]# echo ${!shuzu_2[@]} index1 index2 index3 [root@shell01 ~]# echo ${!shuzu_1[@]} name age skill #显示所有值 [root@shell01 ~]# echo ${shuzu_2[@]} nginx mysql php [root@shell01 ~]# echo ${shuzu_1[@]} qiudao 18 linux #显示单个值 [root@shell01 ~]# echo ${shuzu_1[name]} qiudao [root@shell01 ~]# echo ${shuzu_1[age]} 18 #索引切片在关联数组中不要用,显示的结果有问题 [root@shell01 ~]# echo ${shuzu_1[@]:1:1} qiudao [root@shell01 ~]# echo ${shuzu_1[@]:2:1} 18 [root@shell01 ~]# echo ${shuzu_1[@]:0:1} qiudao [root@shell01 ~]# echo ${shuzu_1[@]:3:1} linux
1.普通数组赋值与遍历 [root@shell01 scripts]# vim array-1.sh #!/bin/bash #1.通过while循环进行取值 while read line do #2.定义一个普通数组 hosts[i++]=$line #i++第一次的值是0 #hosts[1]=test done < /etc/hosts #通过循环进行遍历 for i in ${!hosts[@]} do echo "hosts数组的索引为$i,对应值为:${hosts[i]}" done ---------------------------- [root@shell01 scripts]# sh array-1.sh hosts数组的索引为0,对应值为:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 hosts数组的索引为1,对应值为:::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2.使用关联数组统计/etc/passwd文件中的每一个shell的数量 #通过awk实现 [root@shell01 scripts]# awk -F: '{print $NF}' /etc/passwd| sort | uniq -c 1 /bin/bash 1 /bin/sync 1 /sbin/halt 20 /sbin/nologin 1 /sbin/shutdown #通过shell脚本实现 [root@shell01 scripts]# vim array-2.sh #!/bin/bash #1.声明关联数组 declare -A Shell_count #2.对数组进行复制 while read line do Type=$(echo $line|awk -F: '{print $NF}') let Shell_count[$Type]++ done < /etc/passwd #3.遍历 for i in ${!Shell_count[@]} do echo "Shell: $i , Count: ${Shell_count[$i]}" done
--------------------------------
#注意:如果返回的每行内容不整齐,可以用 column -t进行调整
sh tcp11.sh |column -t