2012-09-06 55 views
10

我想通过包含其他数组的数组,并且这些数组由具有空格的字符串组成。问题是我似乎无法保留字符串中的间距。用空格字符串要么分为多个项目,如果我改变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 
+0

对于'low1',每个元素都在一个单独的行上。对于'low2'和'low3',所有元素都出现在一行上。这是故意的吗? – chepner

回答

4

更换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元素的空白

5

我认为你的意思是,输出应该是这样的:

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