用空格循环数组string

我试图通过包含其他数组的数组循环,这些数组由包含空格的string组成。 问题是,我似乎无法保留string中的间距。 如果我将IFS更改为\ n,或者将数组的所有元素都视为1项,如果我将IFS保持不变,则这些包含空格的string将被分成多个项目:

#!/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
二
 CC
 DD
 EE
 FF

正如你所看到的,“AA QQ”和“BB LL”的元素已经被拆分了。

如果我取消注释将IFS设置为\n的行,我会得到以下结果:

 AA QQ BB LL
 CC DD
 EE FF

现在“AA QQ”和“BB LL”连接在一起!

有没有反正我可以保留这些元素就像他们原来的…我需要输出看起来像这样:

 AA QQ
 BB LL
 CC 
 DD
 EE 
 FF

Solutions Collecting From Web of "用空格循环数组string"

我想你的意思是输出应该是这样的:

 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就不会起作用。

用间接参数扩展替换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元素中的空白。