Bash 数组值就像循环内的变量

Bash 数组值就像循环内的变量

我尝试使用数组值(例如循环的数组名称)进行双循环

array1="name1 name2"
name1="one two"
name2="red blue"

for name in $array1
do 
  for value in $name
  do
    echo "$name - $value"
  done
done

我需要在第二个循环中使用“name”到“$name”,但这对我不起作用。
我如何在第二个循环中使用 array1 的值,就像数组的名称一样?

答案1

这不是您在bash.

a="foo bar"

定义字符串/标量变量。并将其用作(不带引号)执行 split+glob 运算符,该运算符仅对表示分隔的文件模式列表的$a字符串有意义。$IFS

在 中bash,数组定义为:

a=(foo bar)

所以在这里,你想要:

array1=(name1 name2)
name1=(one two)
name2=(red blue)


for name in "${array1[@]}"
do
  typeset -n nameref="$name"
  for value in "${nameref[@]}"
  do
    printf '%s\n' "$name - $value"
  done
done

typeset -n是一个相对较新的补充bash并声明名称引用,这是一个包含另一个变量名称的变量,展开时实际上指的是指定的变量。

答案2

for value in $name从 到的简单更改for value in ${!name}将使您的脚本正常工作:

array1="name1 name2"; name1="one two"; name2="red blue"

for       name  in $array1     ; do 
    for   value in ${!name}    ; do
          printf '%s - %s\n' "$name" "$value"
    done
done

不过,需要指出的是,调用的变量array1是一个字符串,而不是一个数组,根本不是。
如果您想使用数组:

#!/bin/bash

array1=(name1 name2)
name1=(one two)
name2=(red blue)

for       name  in "${array1[@]}"     ; do
          ref="${name}[@]"
    for   value in "${!ref}"          ; do
          printf '%s - %s\n' "$name" "$value"
    done
done

间接从 bash 2.0 (1997) 及更高版本开始工作。而不是最近 4.3 添加的 nameref。

答案3

正如 Stéphane Chazelas 指出的那样,单词列表与数组不同。但是,您可以像这样使用间接扩展:

array1="name1 name2"
name1="one two"
name2="red blue"

for name in ${array1}
do
    for value in ${!name}
    do
        echo "$name - $value"
    done
done

在这种情况下,${!name}引入了间接级别。

相关内容