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

 

posted @ 2022-06-19 18:04  南哈哈  阅读(619)  评论(0)    收藏  举报