我正在尝试遍历包含其他数组的数组,这些数组由带空格的字符串组成。问题是我似乎无法保留字符串中的间距。如果我将IFS更改为\ n,则将带有空格的字符串分成多个项目,或者如果我将IFS保持不变,则将数组的所有元素视为1项目,这是一些示例代码:
#!/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
现在连接“AA QQ”和“BB LL”!
无论如何,我可以保留这些元素,就像它们原始的一样......我需要输出看起来像这样:
AA QQ BB LL CC DD EE FF
答案 0 :(得分: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
就不会发挥作用。
答案 1 :(得分: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
元素中的空格。