我用 for 循环声明了 var0、var1、var2、var3。如何回显 for 循环内的变量?这是代码。
#!/bin/bash
for i in {0..3}
do
export var$i=$i
done;
我在那里定义了 var0、var1、var2、var3.. 如何在循环中访问它们?
我尝试了以下方法
for i in {0..3}
do
echo $var$i
tmpvar=var$i
echo $tmpvar
done
但没有人给我 var0,var1 的值...第一个 echo 只打印了“0,1,2,3”,第二个 echo 打印了“var0,var1,var2,var3”我该怎么办?我想要价值观..
答案1
鉴于,
var0=a
var1=b
var2=c
对于 ksh93 或 bash 4.3 或更高版本,您可以使用 nameref 来指向各个变量:
for i in 0 1 2; do
typeset -n p="var$i"
echo "$p"
done
但是,除非您明确需要将变量作为单独的标量(例如,因为您通过环境传递它们),并且不使用严格的标准 shell,而是使用 Bash 或 ksh,否则您应该使用数组:
#!/bin/bash
a=(a b c)
for i in 0 1 2; do
echo "${a[i]}"
done
或者忽略索引:
for x in "${a[@]}"; do
echo "$x"
done
(当然,Zsh 也有数组,它默认从 1 开始索引,所以第一个不能直接工作。)
答案2
您可以使用 eval 来实现:
$ var1='< 1 >'; var2='< 2 >'; var3='< 3 >'
$ for i in 1 2 3; do eval echo \$var$i; done
$ for i in 1 2 3; do eval "echo \$var$i"; done
$ for i in 1 2 3; do eval 'echo $var'$i; done
$ for i in 1 2 3; do eval "v=\$var$i"; echo "$v"; done
请注意引用和转义。如果值包含空格或通配符,前三个将在空格上分割值,然后展开与通配符匹配的所有文件名。这可能是也可能不是您想要的。例如:
$ var1='< x >' var2='< * >' $ for i in 1 2;执行 eval echo \$var$i;完毕 <x> <[当前目录中的文件名列表]>
(请注意,自从收到和作为单独的参数以来,周围的双空格x
已折叠为单空格。)echo
<
x
>
要解决这个问题,您需要确保变量扩展在 中被引用eval
,例如:
$ for i in 1 2; do eval echo \"\$var"$i"\"; done
< x >
< * >
(也引用$i
上面的内容,除非您知道IFS
不包含任何数字。)