10

我正在尝试遍历包含其他数组的数组,这些数组由带空格的字符串组成。问题是我似乎无法保留字符串中的间距。如果我将 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
二
抄送
DD
EE
法郎

如您所见,元素“AA QQ”和“BB LL”已被拆分。

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

AA QQ BB LL
抄送
东风

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

无论如何我可以保留这些元素,就像它们原来的一样......我需要输出看起来像这样:

AAQQ
BB LL
抄送
DD
EE
法郎
4

2 回答 2

5

我认为您的意思是输出应如下所示:

AA  QQ
BB  LL
CC
DD
EE
FF

IE:

${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/bashbash 脚本。

解释:${!x}是间接变量扩展。它计算出名称包含在 中的变量的值$x

对于我们的需要,x还需要有[@]数组扩展的后缀。特别注意它 isx=${high_item}[@]not x=${high_item[@]}

必须在数组上下文中评估它;否则,它不会按预期工作(如果你这样做arrays=${!x})。

啊,最后一点:IFS在这里没有任何区别。只要您正在处理带引号的数组,IFS就不会起作用。

于 2012-09-06T13:22:45.267 回答
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.

于 2012-09-06T13:22:30.070 回答