у меня есть следующие переменные:
# 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
это "бар" я хочу 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
Тоже все переменные к значениям по умолчанию.
К сожалению, это не так просто. У вас есть идея решить эту проблему?
Заранее спасибо, Крисси
Думаю, разобрался:
TARGET_VAR="$(eval "echo \${MYVAR_${USER_INPUT^^}-$MYVAR_DEFAULT}")"
somecommand -foo "$(eval "echo \${MYVAR_${USER_INPUT^^}-$MYVAR_DEFAULT}")"
Он совместим с bash. Без ${USER_INPUT^^}
в sh тоже работает. Не слишком красиво, но работает;)
USER_INPUT
устанавливается только надежными пользователями, так что все будет в порядке
А 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
Вы можете адаптировать это к своим потребностям - обернуть в функцию или что-то еще.