Bash - 如何使用 FOR 循环访问带有数字后缀的变量

Bash - 如何使用 FOR 循环访问带有数字后缀的变量

我用 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不包含任何数字。)

相关内容