下面的代码说明了我的问题,恐怕我在第一轮中过于简单化了。
#!/bin/bash
dogLover=1
catLover=2
for ii in dog cat
do
petLover=${ii}Lover
echo (evaluate $petLover)
done
我希望代码返回数值 1 和 2,而不是狗和猫。想必这很容易做到,但我似乎在网上看不到如何做到。
我真正需要的是相当于 matlab 中“eval”命令的 bash
答案1
要取消引用,在任何 Bourne 或 POSIX shell 中:
dogLover=1
ii=dog
eval "petLover=\${${ii}Lover}"
echo "$petLover"
答案2
虽然 StephaneChazelas 所说的是正确的,您可以使用eval
,但作为一般做法,许多人试图远离 eval。
为此,您可以使用“间接扩展”。当你有一个变量包含另一个变量的名称时,就会使用它。要使用它,只需在变量前面加上!
大括号即可。
例如:
# var=foobar
# varname=var
# echo "${!varname}"
foobar
这样做的缺点是它不是 POSIX。这意味着不能保证它在所有 shell 上都可用。但由于您问题中的标签包含在内bash
,这可能是可以接受的。
答案3
在 for 循环中,您没有使用文本“dog”和“cat”而不是变量。
使用
for ii in $dog $cat ; do
这将扩展到
for ii in 1 2 ; do