我有以下变量:
# 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}"
这是在多个“配置文件”之间切换一组变量。在示例中,FOO
和BAR
是配置文件。应该可以轻松添加新配置文件,在此示例中,将有一个名为的隐式配置文件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
您可以根据您的需要进行调整 - 将其包装到函数或其他任何函数中。