shell 数组

Posted love2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 数组相关的知识,希望对你有一定的参考价值。

一、数组简介

数组 是 shell 中的一种基础数据类型,用来存储大量数据。但是实际使用环境中,其实用到的并不像其他变成语言中那么多,主要是因为shell主要是为了完成一些简单的任务,并不需要太复杂的代码。但是,作为一种编程语言,了解其基础数据类型是很有必要的。

二、数组定义的两种方式

2.1、普通数组

直接在数组中添加元素,不需要申明。只能通过数字进行索引取值。
1)定义

[root@localhost ~]# a=(1 2 3 4 5 6 7 )

2) 取值

[root@localhost ~]# echo ${a[3]} #取出索引为3对应位置的值
4
[root@localhost ~]# echo ${a[*]} #取出所有元素
1 2 3 4 5 6 7
[root@localhost ~]# echo ${a[@]} #取出所有元素
1 2 3 4 5 6 7
[root@localhost ~]# echo ${!a[@]} #取出所有索引
0 1 2 3 4 5 6

3)建立数组的另一种方式,通过赋值。

[root@localhost ~]# b[0]=10
[root@localhost ~]# b[1]=4
[root@localhost ~]# b[3]=6
[root@localhost ~]# echo ${b[@]}
10 4 6
2.2、关联数组

关联数组需要使用关键字先声明,然后在创建
1)定义

[root@localhost ~]# declare -A  bb
[root@localhost ~]# bb=([index1]=python [index2]=shell)

2) 取值

[root@localhost ~]# echo ${bb[index1]}
python
[root@localhost ~]# echo ${bb[index2]}
shell
[root@localhost ~]# echo ${bb[*]}
python shell
[root@localhost ~]# echo ${bb[@]}
python shell
[root@localhost ~]# echo ${!bb[@]}
index1 index2

3) 通过赋值创建

[root@localhost ~]# declare -A c
[root@localhost ~]# c[name]=huahua
[root@localhost ~]# c[age]=18
[root@localhost ~]# echo ${c[name]}
huahua
[root@localhost ~]# echo ${c[age]}
18

三、数组切片操作

1、普通数组切片,遵循顾头不顾尾的原则,
[root@localhost ~]# b[0]=10
[root@localhost ~]# b[1]=4
[root@localhost ~]# b[3]=6
[root@localhost ~]# echo ${b[@]:1:2}
4 6
[root@localhost ~]# echo ${b[@]:1:4} 
4 6
[root@localhost ~]# echo ${b[@]:0:3}
10 4 6
[root@localhost ~]# echo ${b[@]:0:1}
10
2、关联数组切片

不支持使用关联索引进行切片,而只能使用数字索引进行切片

[root@localhost ~]# declare -A info
[root@localhost ~]# info[age]=18
[root@localhost ~]# info[name]=love2
[root@localhost ~]# info[skill]=python
[root@localhost ~]# echo ${info[@]}
love2 18 python
[root@localhost ~]# echo ${info[@]:0:1}
love2
[root@localhost ~]# echo ${info[@]:0:2}
love2 18
[root@localhost ~]# echo ${info[@]:0:3}
love2 18 python

四、数组应用

4.1使用数组打印hosts文件,貌似有点无聊
#!/bin/bash
i=0
while read line
do
hostarray[i++]=$line
done </etc/hosts
for j in ${!hostarray[*]}
do
    echo ${hostarray[$j]}
done
4.2、使用数组进行统计

4.2.1) 生成统计文件

[root@centos ~]# cat > ha.txt <<-EOF
jh m
nj f
ki m
lk m
uh f
EOF

4.2.2)使用命令统计

[root@localhost ~]# awk '{print $2}' ha.txt|sort|uniq -c|sort -rn
      3 m
      2 f

4.2.3)使用数组进行统计

#!/bin/bash
declare -A array_count
while read line
do
        type=$(echo $line|awk '{print $2}')
        let array_count[$type]++
done<ha.txt
for i in ${!array_count[*]}
do
        echo "$i 次数为:${array_count[$i]}"
done

#执行结果
[root@localhost ~]# bash a2.sh
f 次数为:2
m 次数为:3
4.3、统计不同账户的数量

4.3.1)、使用命令统计

[root@localhost ~]# awk -F ':' '{print $NF}' /etc/passwd|sort|uniq -c|sort -n
      1 /bin/sync
      1 /sbin/halt
      1 /sbin/shutdown
      6 /bin/bash
     22 /sbin/nologin

4.3.2)、使用数组进行统计

#!/bin/bash
declare -A user_array
while read line
do
    type=`echo $line|awk -F ':' '{print $NF}' `
    let user_array[$type]++
done</etc/passwd

for i in ${!user_array[*]}
do
    echo " 用户类型为:$i,该类型用户个数为:${user_array[$i]}"
done

#执行结果
[root@localhost ~]# bash a3.sh 
 用户类型为:/sbin/nologin,该类型用户个数为:22
 用户类型为:/bin/sync,该类型用户个数为:1
 用户类型为:/bin/bash,该类型用户个数为:6
 用户类型为:/sbin/shutdown,该类型用户个数为:1
 用户类型为:/sbin/halt,该类型用户个数为:1

以上是关于shell 数组的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]

shell 脚本 片段

vue2.0 代码功能片段

web代码片段