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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值