如何动态生成新的变量名称

如何动态生成新的变量名称

我试图在 shell 脚本中生成动态 var 名称,以在循环中处理一组具有不同名称的文件,如下所示:

SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo SAMPLE{$i}
done

我期望输出:

1-first.with.custom.name
2-second.with.custom.name

但我得到:

SAMPLE{1}
SAMPLE{2}

是否可以动态生成 var 名称?

答案1

为什么不使用数组,它们就是用来做类似的事情的。

sample[1]='1-first.with.custom.name'
sample[2]='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo ${sample[$i]}
done

另外,请勿在脚本中使用全大写的变量名称,以防止意外使用保留的变量名称。

答案2

我发现可以得到预期的结果,如下:

for (( i = 1; i <= 2; i++ ))
do
  NEW_NAME=SAMPLE$i
  echo ${!NEW_NAME}
done

答案3

如果您想使用可移植的 POSIX 标准 shell 来执行此操作并避免使用数组等 bash 扩展,则需要使用 eval:

$ foo1='a b c'
$ foo2='d e f'
$ a=1; eval echo \$foo$a
a b c
$ a=2; eval echo \$foo$a
d e f

相关内容