我试图在 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