通过用空格字符串的数组的数组环(Loop through array of arrays of st

2019-07-31 10:27发布

我通过包含其他数组的数组试图环和这些阵列由带有空格的字符串。 问题是,我似乎无法保留字符串中的间距。 用空格字符串要么分为多个项目,如果我改变IFS为\ n或者,如果我离开IFS不变,这里的数组的所有元素都被视为第一项是一些示例代码:

#!/bin/sh
low1=("AA  QQ" "BB  LL")
low2=("CC" "DD")
low3=("EE" "FF")
high=(low1 low2 low3)

for high_item in ${high[@]}
do
   eval arrayz=\${$high_item[@]}
   #IFS=$'\n'
   for item in $arrayz
   do
      echo $item
   done
done

输出:

AA
QQ
BB
LL
CC
DD
EE
FF

正如你所看到的“AA QQ”和“BB LL”已分裂的元素。

如果我取消那台线IFS\n我得到如下:

AA QQ BB LL
CC DD
EE FF

现在, “QQ AA” 和 “BB LL” 被连接起来!

反正我有可以保留这些元素就像他们原来是...我需要输出的样子说:

AA QQ
BB LL
CC 
DD
EE 
FF

Answer 1:

我觉得你的意思是,输出应该是这样的:

AA  QQ
BB  LL
CC
DD
EE
FF

即:

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

这可以通过使用来完成:

#!/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

始终使用#!/bin/bash进行的bash脚本。

说明: ${!x}是间接的变量扩展。 它的计算结果为变量包含在一个名称值$x

对于我们的需要, x需要有[@]后缀阵列扩展为好。 特别要注意,这是x=${high_item}[@]不是 x=${high_item[@]}

而且你必须在阵列方面对其进行评估; 否则,预期这将无法正常工作(如果你这样做arrays=${!x}

嗯,并作为最后请注意: IFS不作任何区别就在这里。 只要你在引用数组时, IFS不会发挥作用。



Answer 2:

更换eval间接参数扩展,你会得到什么,我想你想(虽然它没有你当前给定的输出相匹配:

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

注意需要引用在内部循环阵列的扩展以保留在元件中的空白low1



文章来源: Loop through array of arrays of string with spaces