循环遍历带有空格的字符串数组

A K*_*A K 10 linux arrays bash shell for-loop

我正在尝试循环包含其他数组的数组,这些数组由带空格的字符串组成.问题是我似乎无法保留字符串中的间距.如果我将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
Run Code Online (Sandbox Code Playgroud)

输出:

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

Mic*_*rny 5

我认为你的意思是输出应该如下:

AA  QQ
BB  LL
CC
DD
EE
FF
Run Code Online (Sandbox Code Playgroud)

即:

${low1[0]}
${low1[1]}
${low2[0]}
${low2[1]}
${low3[0]}
${low3[1]}
Run Code Online (Sandbox Code Playgroud)

这可以使用以下方法完成:

#!/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
Run Code Online (Sandbox Code Playgroud)

始终使用#!/bin/bash用于的bash脚本.

说明:${!x}是间接变量扩展.它计算包含在其中的名称的变量值$x.

对于我们的需求,还x需要具有[@]数组扩展的后缀.特别要注意,这是x=${high_item}[@]不是 x=${high_item[@]}.

必须在数组上下文中评估它; 否则,它将无法正常工作(如果你这样做arrays=${!x}).

啊,作为最后的注释:IFS这里没有任何区别.只要您正在处理引用的数组,IFS就不会发挥作用.


che*_*ner 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
Run Code Online (Sandbox Code Playgroud)

请注意,需要在内部循环中引用数组扩展以保留 的元素中的空格low1