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

 

posted @ 2024-06-01 11:38  战斗小人  阅读(212)  评论(0编辑  收藏  举报