Loop through array of arrays of string with spaces

前端 未结 2 488
野的像风
野的像风 2021-02-08 14:50

I\'m trying to loop through an array that contains other arrays and these arrays consist of strings with spaces. The problem is that I can\'t seem to preserve the spacing in the

相关标签:
2条回答
  • 2021-02-08 15:10

    Replace eval with indirect parameter expansion, and you'll get what I think you want (although it doesn't match your current given output:

    for high_item in "${high[@]}"
    do
        arrayz="$high_item[@]"
        # arrayz is just a string like "low1[@]"
        for item in "${!arrayz}"
        do
            echo $item
        done
    done
    

    Note the need to quote the array expansion in the inner loop to preserve the whitespace in elements of low1.

    0 讨论(0)
  • 2021-02-08 15:22

    I think you meant that the output should look like:

    AA  QQ
    BB  LL
    CC
    DD
    EE
    FF
    

    i.e.:

    ${low1[0]}
    ${low1[1]}
    ${low2[0]}
    ${low2[1]}
    ${low3[0]}
    ${low3[1]}
    

    This could be accomplished using:

    #!/bin/bash
    
    low1=("AA  QQ" "BB  LL")
    low2=("CC" "DD")
    low3=("EE" "FF")
    high=(low1 low2 low3)
    
    for high_item in ${high[@]}
    do
        x="${high_item}[@]" # -> "low1[@]"
        arrays=( "${!x}" )
    
        #IFS=$'\n'
        for item in "${arrays[@]}"
        do
            echo "$item"
        done
    done
    

    And please always use #!/bin/bash for bash scripts.

    Explanation: ${!x} is indirect variable expansion. It evaluates to the value of variable with a name contained in $x.

    For our needs, x needs to have the [@] suffix for array expansion as well. Especially note that it is x=${high_item}[@] and not x=${high_item[@]}.

    And you have to evaluate it in array context; otherwise, it wouldn't work as expected (if you do arrays=${!x}).

    Ah, and as final note: IFS doesn't make any difference here. As long as you are working on quoted arrays, IFS doesn't come into play.

    0 讨论(0)
提交回复
热议问题