Bash:variables名称中的variablesreplace与默认值

我有以下variables:

# config file MYVAR_DEFAULT=123 MYVAR_FOO=456 #MYVAR_BAR unset # program USER_INPUT=FOO TARGET_VAR=<need to be set> 

如果USER_INPUT是“foo”,我想TARGET_VARMYVAR_FOOTARGET_VAR = 456)的值。 如果USER_INPUT是“bar”,我想将TARGET_VAR设置为MYVAR_DEFAULT (123),因为MYVAR_BAR未设置。

我更喜欢它是sh兼容和作为替代string。 但它也可能是bash兼容和/或在一个函数。

我有这些片段:

 # Default values for variable (sh-compatible) echo ${MYVAR_FOO-$MYVAR_DEFAULT} # Uppercase (bash compatible) echo ${USER_INPUT^^} 

我需要这样的东西:

 TARGET_VAR="${MYVAR_${USER_INPUT^^}-$MYVAR_DEFAULT}" # or somecommand -foo "${MYVAR_${USER_INPUT^^}-$MYVAR_DEFAULT}" 

这是在多个“configuration文件”之间切换一堆variables。 在这个例子中, FOOBAR是configuration文件。 新的configuration文件应该很容易被添加,在这个例子中,会有一个名为BAZ的隐式configuration文件,所有的variables都是它们的默认值。

不幸的是,这并不容易。 你有解决这个问题的想法吗?

在此先感谢,克里斯

case语句可以处理更多的变体。

 #!/bin/bash MYVAR_DEFAULT=123 MYVAR_FOO=456 echo "Input: " read USER_INPUT case $USER_INPUT in foo) TARGET_VAR=$MYVAR_FOO ;; bar) TARGET_VAR=$MYVAR_DEFAULT ;; *) TARGET_VAR=DEFAULT ;; esac echo $TARGET_VAR 

你可以根据你的需要来调整它,把它包装成一个函数或者其他东西。

我想我明白了:

 TARGET_VAR="$(eval "echo \${MYVAR_${USER_INPUT^^}-$MYVAR_DEFAULT}")" somecommand -foo "$(eval "echo \${MYVAR_${USER_INPUT^^}-$MYVAR_DEFAULT}")" 

它是bash兼容的。 没有${USER_INPUT^^}它也适用于sh。 它不太漂亮,但工作;)

USER_INPUT只能由可靠的用户设置,所以没关系