当前位置 博文首页 > 浅谈shell 遍历数组的几种方法

    浅谈shell 遍历数组的几种方法

    作者:highfei2011 时间:2021-02-04 06:02

    背景

    某天遇到一个问题,现象如下:第一种遍历正常打印元素,然而第二种遍历只会打印一个元素!

    #!/bin/bash
    # $1 代表文件目录
    # 执行 eg:
    #  sh your_shell.sh /user/lib/
     
    echo "开始时间:`date '+%Y-%m-%d %H:%M:%S'`"
    # 1、获取所有的 file
    files=`ls $1`
     
    # 2、定义 1个数组变量
    declare -a array_files01
     
     
    # 数组 index 初始化为 0
    m1=0
     
     
    # 遍历
    for ays in ${files}; do
    {
     # 获取数组长度
     num_1=${#array_files01[@]}
     
     # 添加元素到数组中, index 每次需要 +1
     array_files01[m1]=${ays};
     m1=`expr ${m1} + 1`;
     
     fi
    }
    done
     
    echo "结束分配数组时间:`date '+%Y-%m-%d %H:%M:%S'`"
    # 打印提示信息
    echo "1数组长度:${#array_files01[@]}"
     
    # 第一种遍历:正常
    for i in ${array_files01[@]}; do
     echo $i
    done 
     
    # 第二种遍历:不正常
    for i in ${array_files01}; do
     echo $i
    done 
    

    几种遍历数组的方法

    1、for 循环

    ################### 第一种 #######################
    for i in ${array[@]}
    #也可以写成for element in ${array[*]}
    do
    echo $i
    done
    
    ################## 第二种 ########################
    for i in ${array[*]}
    do
    echo $i ;
    done
     
    ################## 第三种 ########################
    for(( i=0;i<${#array[@]};i++)) do
    #${#array[@]}获取数组长度用于循环
    echo ${array[i]};
    done;

    2、while 循环

    i=0 
    while [ $i -lt ${#array[@]} ] 
    #当变量(下标)小于数组长度时进入循环体
    do 
     echo ${ array[$i] } 
     #按下标打印数组元素
     let i++ 
    done 
    

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

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