Назад | Перейти на главную страницу

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 это "бар" я хочу 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

Вы можете адаптировать это к своим потребностям - обернуть в функцию или что-то еще.