shell数组的定义与应用
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。shell 下的多维数组是可以通过1维数组组合的,本篇也会在后面提到多维数据。
一、定义数组
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
1array=(value1 value2 ...... valueN) #从下标0开始依次赋值
2array=([1]=value1 [2]=value2 [0]=value0) #指定下标赋值
3declare -a array=(value1 value2 ...... valueN) #声明+赋值,也可以只声明
4unixtype=('Debian' 'Red Hat' 'Fedora') #如果元素有空格,就要用引号
5set| grep array #利用set查看数组赋值情况
除此之外也可以通过read的交互的方式定义数组。如下:
1# read -a array #-a表示从标准输入读入数组,遇到换行为止
21 2 3 4 5
3# echo "${array[@]}"
41 2 3 4 5
可以通过如下方法清除数组:
1unset array #清除数组
2unset array[1] #清除数组的指定元素
示例:
1unixtype=('Debian' 'Red Hat' 'Fedora')
2各值单独定义
3NAME[0]="Zara"
4NAME[1]="Qadir"
5NAME[2]="Mahnaz"
二、数组变量
现网应用中经常需要获取元素的个数、下标值的情况,shell本身也提供了获取的方法。
1# 取得数组元素的个数
2length=${#array_name[@]}
3# 或者
4length=${#array_name[*]}
5# 取得数组单个元素的长度
6lengthn=${#array_name[n]}
7#取得数组下标的值
8${!array[@]}
9#从数组的n位置开始取m个元素
10${array[@]:n:m}
示例如下:
1[root@localhost ~]# unixtype=('Debian' 'Red Hat' 'Fedora')
2[root@localhost ~]# echo ${#unixtype[@]}
33
4[root@localhost ~]# echo ${#unixtype[*]}
53
6[root@localhost ~]# echo ${#unixtype[1]}
77
8[root@localhost ~]# echo ${!unixtype[@]}
90 1 2
10[root@localhost ~]# echo ${!unixtype[2]}
11 --> 无结果输出
12[root@localhost ~]# echo ${unixtype[@]:1:2}
13Red Hat Fedora
14[root@localhost ~]# echo ${unixtype[@]:1:3}
15Red Hat Fedora
注意${array[@]:n:m}
的用法,后面的m当大于可取的范围时,是不会报错的。
三、数组的常用操作
1、命令执行结果放入数组
1[root@361way ~]# array=($(ls | grep '.sh'))
2或
3[root@361way ~]# array=(`ls | grep '.sh'`)
4[root@361way ~]# echo ${array[@]}
511.sh a.sh b.sh del_log.sh getcoreinfo.sh ntp.sh read.sh rrs.sh script.sh
2、读入字符串,给数组赋值
1i=0
2n=5
3while [ "$i" -lt $n ] ; do #遍历5个输入
4 echo "Please input strings ... `expr $i + 1`"
5 read array[$i] #数组赋值
6 b=${array[$i]}
7 echo "$b"
8 i=`expr $i + 1` #i递增
9done
3、字符串的字母逐个放入数组并输出
1# cat a2.sh
2chars='abcdefghijklmnopqrstuvwxyz'
3i=0
4while [ $i -lt ${#chars} ] ; do # ${#char}是字符串长度
5 #echo ${chars:$i:1} $i
6 array[$i]=${chars:$i:1} #从$i取1个字节
7 echo ${array[@]} $i
8 #echo ${array[$i]} $i
9 i=`expr $i + 1`
10done
执行测试的时候,可以试下将echo ${array[@]} 换做echo $array
,会发现输出会有不同的,默认echo $arry 输出的是下第一个元素,即下标为0的值。这点是和python里的数组不一样的。
4、判断一个变量是否在数组中
一个很简洁的写法是:
1echo ${array[@]} | grep -wq "${member}"
2 if [ $? -eq $SUCCESS ];then
3但是这会带来一个问题,如果array的元素里面带有空格,就会误认为是一个元素,因此遍历比较是更稳妥的选择。
4
5for i in ${array[@]};do
6 if [ "$i" = "${member}" ];then
7 ....
8 fi
9done
5、构建二维数组
1a=('1 2 3' '4 5 6' '7 8 9') #赋值,每个元素中都有空格
2for i in ${a[@]} ; do
3 b=($i) #赋值给b,这样b也是一个数组
4 for j in ${b[@]};do #相当于对二元数组操作
5 ......
6 done
7done
6、文件内容读入数组
1# cat /etc/shells | tr "\n" " " >/tmp/tmp.file #回车变空格
2# read -a array < /tmp/tmp.file #读入数组
3# set| grep array
4array=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/dash")
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/shell-array/4965.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.