Shell 数组变量
Shell 数组变量
普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引
普通数组
查看普通数组declare -a
定义数组
方法一:一次赋一个值 数组名[下标]=变量名 array1[0]=shell array1[1]=nginx array1[2]=redis array1[3]=mysql 方法二:一次赋多个值 array2=(tom jack alice) array3=(`cat /etc/passwd`) `希望`是将该文件中的每一个行作为一个元数赋值给数组array3(行中没有空格,否则会被处理成多行) array4=(`ls /var/log/*.log`) array5=(tom jack alice "bash shell") colors=($red $blue $green $recolor) array6=(1 2 3 "linux shell" [20]=kubernetes)
查看数组
~ » declare -a declare -a array='([0]="1" [1]="2" [2]="3" [3]="linux shell" [20]="kubernetes")' declare -a books='([0]="linux" [1]="shell" [2]="awk" [3]="docker")'
访问数组的元数
echo ${array6[0]} # 访问数组中的第一个元数 echo ${array6[@]} # 访问数组中所有元数 等同于${array6[*]} echo ${#array6[@]} # 统计数组元数的个数 echo ${!array6[@]} # 获取数组元数的索引(下标) echo ${array6[@]:1} # 从数组下标1开始 echo ${array6[@]:1:2} # 从数组下标1开始,访问两个元素
遍历数组
方法一:通过数组元数的个数进行遍历
方法二:通过数组元数的索引进行遍历
关联数组
定义关联数组
申明关联数组变量 ~ » declare -A ass_array1 ~ » declare -A ass_array2 方法一:一次赋一个值 数组名[下标]=变量值 ass_array1[name]=south ass_array1[age]=28 ass_array1[sex]=male ass_array1[height]=180 方法二:一次赋多个值 ass_array2=([name]=tom [index]=jack [two]=alice [shell]="bash shell")
# 变量 name=south +--------------+ |s |o |u |t |h | +--------------+ |0 |1 |2 |3 |4 | 索引 +--------------+ # 切片 echo ${name:1:3} # 从1开始切3个 out # 普通数组 python(列表) books=(linux shell awk [20]=docker) +--------------------------+ |linux |shell |awk |docker | +--------------------------+ |0 |1 |2 |20 | 索引(下标) +--------------------------+ echo ${#books[@]} # 输出数组数量 echo ${books[3]} # 输出下标3的书 # 关联数组 python(字典) info=([name]=south [sex]=male [age]=28 [height]=180) +-------------------------+ |south |male |28 |180 | +-------------------------+ |name |sex |age |height | 索引 +-------------------------+
数组的赋值和遍历
1. while #!/bin/bash # 遍历hosts文件每行赋值给line while read line do hosts[++i]=$line # 创建hosts数组 hosts[1]="$line"... "i++"是0开始 "++i"是1开始 done < /etc/hosts # 打印第一个数组 echo "hosts first: ${hosts[1]}" echo # 通过下标遍历普通数组 for i in ${!hosts[@]} do echo "$i: ${hosts[i]}" done # 查看数组 declare -a|grep hosts 2.for #!/bin/bash OLD_IFS=$IFS IFS=$'\n' # 定义换行符 # for循环是以空格,tab键,回车进行分隔 for line in `cat /etc/hosts` do hosts[++i]=$line done for i in ${!hosts[*]} do echo "$i: ${hosts[i]}" done # 取消上面使用的换行符 IFS=$OLD_IFS
Array 实现性别统计
# i的值是0 i++三次后是3 ~ » let i++ ~ » let i++ ~ » let i++ ~ » echo $i 3 [root@nan ]# declare -A sex # 创建关联数组 [root@nan ]# sex=([m]=1) # 定义m下标 [root@nan ]# sex+=([f]=1) # += 添加元素 [root@nan ]# declare -A|grep sex declare -A sex='([f]="1" [m]="1" )' [root@nan array]# echo ${sex[@]} 1 1 [root@nan array]# echo ${!sex[@]} f m [root@nan ]# let sex[m]++ # 索引对应的值进行自加 [root@nan ]# let sex[m]++ [root@nan ]# declare -A|grep sex declare -A sex='([f]="1" [m]="3" )' ------------------------------------------------ #!/bin/bash # count sex # shell: `cat sex.txt |awk '{print $2}'|sort |uniq -c` # 定义关联数组,Second_column是索引,也就是男或女,值是人数 declare -A sex while read line do # 文件第二列定义了性别 Second_column=`echo $line|awk '{print $2}'` # 索引对应的值每行循环都后进行自加1 let sex[$Second_column]++ done < sex.txt declare -A|grep sex # 遍历循环输出 for i in ${!sex[@]} do # 输出下标: 值 echo "$i: ${sex[$i]}" done sh count_sex.sh declare -A sex='([f]="3" [m]="5" )' f: 3 m: 5
统计不同类型shell数量
#!/bin/bash declare -A shells while read line do login_shell=`echo $line | awk -F":" '{print $NF}'` let shells[$login_shell]++ done </etc/passwd for i in ${!shells[@]} do echo "$i: ${shells[$i]}" done
统计tcp连接状态数量
#!/bin/bash while true do unset status 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 sleep 1 clear done
本文作者:南哈哈
本文链接:https://www.cnblogs.com/nanruosen/p/16391006.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步