Bash:使用默认值替换变量名中的变量

Bash:使用默认值替换变量名中的变量

我有以下变量:

# 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_VAR将其设置为MYVAR_FOO( TARGET_VAR=456)。如果USER_INPUT是“bar”,我希望TARGET_VAR将其设置为MYVAR_DEFAULT(123),因为MYVAR_BAR未设置。

我更喜欢它与 sh 兼容并作为替换字符串。但它也可能与 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}"

这是在多个“配置文件”之间切换一组变量。在示例中,FOOBAR是配置文件。应该可以轻松添加新配置文件,在此示例中,将有一个名为的隐式配置文件BAZ,所有变量也将恢复为默认值。

不幸的是,这并不容易。您有什么办法可以解决这个问题吗?

提前致谢,krissi

答案1

我想我已经明白了:

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

它与 bash 兼容。没有${USER_INPUT^^}它,在 sh 中也能工作。它不是很漂亮,但能用 ;)

USER_INPUT仅由值得信赖的用户设置,所以没问题

答案2

一个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

您可以根据您的需要进行调整 - 将其包装到函数或其他任何函数中。

相关内容