返回索引变量的数值而不是其名称

返回索引变量的数值而不是其名称

下面的代码说明了我的问题,恐怕我在第一轮中过于简单化了。

#!/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

相关内容