shell数组的定义与应用

2012年10月27日 发表评论 阅读评论

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")




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: shell脚本学习 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.