如何在另一个变量的名称中使用 shell 变量的扩展值?

如何在另一个变量的名称中使用 shell 变量的扩展值?

我非常渴望让以下事情发挥作用:

#!/bin/bash
MARCOMIN=1
MARCOMAX=3
ENZOMIN=1
ENZOMAX=3
GIOVANNIMIN=1
GIOVANNIMAX=3
VALUEMARCO=12
VALUEGIOVANNI=4
VALUEENZO=12

for i in MARCO ENZO GIOVANNI; do
        echo $$iMIN is $i\'s MIN
        echo $$iMAX is $i\'s MAX
        echo $VALUE$i is $i\'s VALUE
done

exit 0

但它并没有像我想要的那样编​​写宏。

me@myhost:~$ bash test.sh
20341iMIN is MARCO's MIN
20341iMAX is MARCO's MAX
MARCO is MARCO's VALUE
20341iMIN is ENZO's MIN
20341iMAX is ENZO's MAX
ENZO is ENZO's VALUE
20341iMIN is GIOVANNI's MIN
20341iMAX is GIOVANNI's MAX
GIOVANNI is GIOVANNI's VALUE

显然这只是我的测试之一。我尝试了许多不同的方法来以这种方式编写宏,但我无法修复它。在这里和 SO 上发现了很多类似的问题,但没有一个符合我的情况。

bash -x test.sh如下:

+ MARCOMIN=1
+ MARCOMAX=3
+ ENZOMIN=1
+ ENZOMAX=3
+ GIOVANNIMIN=1
+ GIOVANNIMAX=3
+ VALUEMARCO=12
+ VALUEGIOVANNI=4
+ VALUEENZO=12
+ for i in MARCO ENZO GIOVANNI
+ echo 21466iMIN is 'MARCO'\''s' MIN
21466iMIN is MARCO's MIN
+ echo 21466iMAX is 'MARCO'\''s' MAX
21466iMAX is MARCO's MAX
+ echo MARCO is 'MARCO'\''s' VALUE
MARCO is MARCO's VALUE
+ for i in MARCO ENZO GIOVANNI
+ echo 21466iMIN is 'ENZO'\''s' MIN
21466iMIN is ENZO's MIN
+ echo 21466iMAX is 'ENZO'\''s' MAX
21466iMAX is ENZO's MAX
+ echo ENZO is 'ENZO'\''s' VALUE
ENZO is ENZO's VALUE
+ for i in MARCO ENZO GIOVANNI
+ echo 21466iMIN is 'GIOVANNI'\''s' MIN
21466iMIN is GIOVANNI's MIN
+ echo 21466iMAX is 'GIOVANNI'\''s' MAX
21466iMAX is GIOVANNI's MAX
+ echo GIOVANNI is 'GIOVANNI'\''s' VALUE
GIOVANNI is GIOVANNI's VALUE
+ exit 0

答案1

bash 支持变量间接

#!/bin/bash
MARCOMIN=1
MARCOMAX=3
ENZOMIN=1
ENZOMAX=3
GIOVANNIMIN=1
GIOVANNIMAX=3
VALUEMARCO=12
VALUEGIOVANNI=4
VALUEENZO=12

for i in MARCO ENZO GIOVANNI; do
    for j in MIN MAX VALUE; do
        varname="${i}${j}"
        # For VALUE we need reverse order of i and j
        [[ $j = VALUE ]] && varname="${j}${i}"

        printf "%d is %s's %s\n" "${!varname}" "$i" "$j"
    done
done

exit 0

我对内部循环做了一些额外的操作,并使用printf代替echo,但中心思想是,给定foo存储在另一个变量中的变量名,您可以通过执行 来bar获取 的值。$foo${!bar}

更多的:https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean

答案2

要在另一个变量的名称中使用变量扩展,传统上是使用eval内置 shell 命令来完成的。这通常会导致倾斜牙签综合症(许多反斜杠和双重转义符),这表明可能有一种“更好”的方式来完成您想做的事情。还存在与使用eval内置相关的安全问题。

无论如何,这是实现您想要的目标的一种方法:

# ...
    eval echo \$${i}MIN is \$i\\\'s MIN
    eval echo \$${i}MAX is \$i\\\'s MAX
    eval echo \$VALUE${i} is \$i\\\'s VALUE
# ...

相关内容