Shell,连接 2 个字符串以引用第三个变量

Shell,连接 2 个字符串以引用第三个变量

我试图在我的脚本中执行以下操作:

#/bin/bash -x
var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
   echo \$var$i
done

显然,这不会按预期工作并导致以下输出:

$var1
$var2
$var3
$var4

如何动态引用循环中的变量?

答案1

您在找这个吗?

$ cat indirection.bash
#!/bin/bash -x

var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
        s="var${i}"
        echo "${!s}"
done

 

$ ./indirection.bash
www
www2
www3
www4

答案2

您可以使用数组:

#/bin/bash -x

declare -a vars=(
    www
    www2
    www3
    www4
)

for var in "${vars[@]}"; do
   echo "$var"
done

或者用索引迭代:

for i in "${!vars[@]}"; do
    echo "${vars[$i]}"
done

答案3

通常 shell 只扩展变量一次。您可以使用间接扩展或要求 shell 再次扩展它,例如:

eval "val=\$var$i"; echo "$val";

而不仅仅是:

echo "\$var$i"

这种方法非常便携,但是使用了邪恶 eval

使用其他答案中所示的间接扩展(请参阅中的参数扩展男人狂欢${!VAR_NAME}当不需要可移植性并且允许您使用 BASH 扩展时,) 是一个很好的解决方案。

答案4

使用关联数组。没有充分的理由生成这样的变量名称。

确实存在哈希表实现,例如这个这可能比直接通过 eval 滥用 shell 的内部符号表作为哈希映射要稍微简单一些。这个特定的问题我还没有完全详细地分析过,可能在某种程度上是这样做的——看起来使用 nameref 解析,但仍然是一种改进。

相关内容