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