shell数组遍历

Shell数组遍历的三种方法及注意事项
_荣耀之路_ 2019-02-25 16:34:05 5424 收藏
展开

遍历数组时,使用哪种方式取决于数组中元素的分布情况。

定义如下两个数组:

    #下标连续
    arr1=(a b c d e)
    #下标不连续
    arr2=([2]="a b" [5]="c" [8]=4 [10]="csdn")

1.for,适用于数组下标连续的情况,如果数组下标不连续会得不到完整的结果。

    for ((i=0;i<${#arr1[@]};i++))
    do
        echo ${arr1[$i]}
    done

2.for...in,无论下标是否连续都可以,有两种方式,一种是直接遍历数组中的元素,一种是通过遍历数组下标获取数组元素。

    #直接遍历数组
    for value in "${arr1[@]}"
    do
        echo $value
    done

    #通过遍历下标获取数组元素
    for i in ${!arr1[@]}
    do
        echo ${arr1[$i]}
    done

3. while,适用于数组下标连续的情况,如果数组下标不连续会得不到完整的结果。

    i=0
    while [ $i -lt ${#arr1[@]} ]
    do
        echo ${arr1[$i]}
        let i++
    done

除了下标问题外,关于@与*在使用时也要注意,并不是完全等价,并且在被双引号包围时的解析有时也略有不同。

对于第一种遍历方式,${#arr1[@]}中@可以与*互换,并且被双引号包围时也是等效的,"${#arr1[@]}"。

对于第二种遍历方式,当直接遍历数组元素时,${arr1[@]}没有被双引号包围时@与*等效,但是解析数组元素时会把元素中的内容也按空格分隔,会导致解析错误。当${arr1[*]}被双引号包围时,会将数组中所有的元素按空格分隔后当作一个元素,解析也是错误的。只有当${arr1[@]}被双引号包围时,才能正确解析数组元素,所以直接遍历数组元素时,必须使用“"${arr1[@]}"”的方式。当通过遍历下标遍历数组元素时,${!arr1[*]}被双引号包围时,所有的元素下标会被逗号分隔后组成一个字符串,所以不能用此方式获取下标集合,其他三种情况可以正确获取下标。

对于第三种遍历方式,不受@、*与双引号影响。
————————————————
版权声明:本文为CSDN博主「_荣耀之路_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/asty9000/article/details/87916658

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值