bash shell之数组使用

摘要:
1、array=(value1 value2 ...... valueN)    #赋值
2、read -a array                                  #读入数组
3、${array[@]}    ${!array[@]}     ${#array[@]}     ${array[@]:n:m}      #数组信息,数组下标,数组长度,去数组位置
4、# array=($(ls | grep rpm))        #命令执行结果放入数组
5、for i in ${a[@]} ; do      #遍历数组
6、set| grep array             #利用set查看数组赋值情况


1、数组的声明、赋值和查看
   BASH只支持一维数组,但参数个数无限制。如果要构造一个二维数组,就需要自己想办法,在第三小节会有举例。bash数组的下标从0开始。
   array=(value1 value2 ...... valueN)               #从下标0开始依次赋值
   array=([1]=value1 [2]=value2 [0]=value0)   #指定下标赋值
   declare -a array=(value1 value2 ...... valueN)   #声明+赋值,也可以只声明
   unixtype=('Debian' 'Red Hat' 'Fedora')           #如果元素有空格,就要用引号
   
   unset array                     #清除数组
   unset array[1]                 #清除数组的指定元素     

read赋值举例
# read -a array                  #-a表示从标准输入读入数组,遇到换行为止
1 2 3 4 5
# echo "${array[@]}"
1 2 3 4 5

查看举例
# echo ${array[0]}
red hat
# echo "${array[0]}"                    #注意加不加引号的区别
red    hat
# echo "${array[@]}"
red    hat fedora
# echo ${array[@]}                     #查看数组的信息,注意引号的区别
red hat fedora
# set | grep array
array=([0]="red    hat" [1]="fedora")        #通过set查看变量和grep结合查看数组的赋值情况


2、数组常用的变量
   array[0]  array[1]  ...... #是数组的每个元素,根据下标指定,类似C语言,读取时相当于变量${array[1]}
   ${#array[@]}  #数组长度
   ${array[@]}    #数组的所有元素
   for i in ${array[@]};do ...  #遍历数组,这时i就是array里的某个元素
   或者for idx in ${!array[@]}   #这时idx就是array的某个下标
   ${array[@]:n:m}   #从数组的n位置开始取m个元素

   变量使用的举例如下:
# array=('red    hat' 'fedora')            #赋值,第一个元素中有多个空格
# echo ${array[@]}
red hat fedora                                  #打印数组,第一个元素的空格变成一个了
# echo "${array[@]}"                      
red    hat fedora                               #加引号保持原貌
# echo ${#array[@]}                        
2                                                     #数组长度
# echo ${!array[@]}
0 1                                                   #数组下标
# echo ${array[@]:1:1}
fedora                                               #获取数组元素


3、数组的常用操作
(1)命令执行结果放入数组
  # array=($(ls | grep rpm))          #建议采用($())的方式
# echo ${array[@]}
bind-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-chroot-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-devel-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-libs-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-sdb-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-utils-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm

# array=(`ls | grep rpm`)            #效果相同,这个例子采用反向单引号
# echo ${array[@]}
bind-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-chroot-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-devel-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-libs-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-sdb-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm bind-utils-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm

(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)字符串的字母逐个放入数组,并输出
chars='abcdefghijklmnopqrstuvwxyz'
i=0
while [ "$i" -lt ${#chars} ] ; do    ${#char}是字符串长度
   array[$i]=${chars:$i:1}            #从$i取1个字节
done

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值