Shell 脚本:使用 keyward 选择一个特定的全局变量

Shell 脚本:使用 keyward 选择一个特定的全局变量

我的 shell 脚本中有多个具有相同模式的全局变量,例如:

VALID_DOMESTIC_ANIMAL=(cat dog)
VALID_ACQUATIC_ANIMAL=(shark dolphin)

现在,还有另一个参数 CATAGORY ,可以是 ACQUATIC/DOMESTIC。如何选择要迭代的预期全局变量?我尝试了以下代码:

#!/bin/bash
VALID_DOMESTIC_ANIMAL=(cat dog)
VALID_ACQUATIC_ANIMAL=(shark dolphin)

CATAGORY=ACQUATIC
VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL
#echo "VALID_CATAGORY_ANIMAL ${VALID_CATAGORY_ANIMAL}"
for anime in "${VALID_CATAGORY_ANIMAL[@]}"; do
    echo "${anime}"
done

我期待输出shark dolphin,但我得到了VALID_ACQUATIC_ANIMAL

如何告诉 bash 脚本如果存在同名变量,则使用它?

答案1

谢谢钢铁起子指明前进的方向变量 - 并集。我使用 nameref 它对我有用。执行以下更改就成功了。

-VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL
+declare -n VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL

答案2

这可能会让事情变得更清楚。该变量包含另一个变量的名称。要获取其值,shell 必须首先展开变量名称,然后展开变量值。

for anime in $(eval echo \${$VALID_CATAGORY_ANIMAL[@]}); do

eval- 它需要一个参数扩展变量并传递给 shell 执行
由于我们转义了第一个美元符号,命令将在以下位置执行:

$(echo ${VALID_ACQUATIC_ANIMAL[@]}

您可以在循环之前插入以下行

echo $VALID_CATAGORY_ANIMAL    #VALID_ACQUATIC_ANIMAL
echo \${$VALID_CATAGORY_ANIMAL[@]}    #${VALID_ACQUATIC_ANIMAL[@]}
eval echo \${$VALID_CATAGORY_ANIMAL[@]}    #shark, dolphin

相关内容