为了能到远方,脚下的每一步都不能少.|

南哈哈

园龄:3年10个月粉丝:2关注:0

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 中国大陆许可协议进行许可。

posted @   南哈哈  阅读(609)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起