我尝试使用数组值(例如循环的数组名称)进行双循环
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}
引入了间接级别。