我试图在我的脚本中执行以下操作:
#/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 扩展时,) 是一个很好的解决方案。