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 数组的主要内容,如果未能解决你的问题,请参考以下文章