我有以下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_VAR
是MYVAR_FOO
( TARGET_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。 在这个例子中, FOO
和BAR
是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
只能由可靠的用户设置,所以没关系