Получить из строки в переменную в Bash
Я пишу сценарий bash для автоматизации некоторых сисадминов. Я начну с проверки того, что определено множество переменных. То, как я это делаю сейчас, выглядит так:
function is_defined {
if [ -z "$2" ]; then
echo "$1 is not defined"
exit
fi
}
is_defined "PROJECTNAME" $PROJECTNAME
Я хотел бы иметь функцию, которая принимает только один аргумент: имя переменной в виде строки, проверяет, что она определена, и если она не определена, сообщите пользователю об этом и завершите работу.
Как правильно заменить магию в bash?
2 ответа
Что-то вроде этого:
function is_defined {
if [ -z "${!1}" ]; then
echo "$1 is not defined"
exit 1
fi
}
$ {! a}, как уже говорилось @sehe, выведет значение переменной с именем $1
Это возможно с экзотическим расширением параметров: ${!var}
, который расширяется до переменной, имя которой является $var
,
Версия 1
is_defined() {
if [ -z "${!1}" ]; then
echo "$1 is not defined"
exit 1
fi
}
Но мы можем упростить это дальше:
Баш имеет ${var?errormsg}
расширение параметров среди его менее известных особенностей. Это в основном означает "если var
определяется, расширить его значение; в противном случае распечатайте errormsg
, задавать $?
ненулевое значение и перейти к следующей команде ". errormsg
не является обязательным, и по умолчанию parameter null or not set
(но ?
необходимо). Как обычно с экзотическим расширением параметра, его можно изменить двоеточием (${var:?errormsg}
) также ошибка, если переменная имеет пустое значение.
В неинтерактивной оболочке ошибка, генерируемая этим расширением параметра, приведет к прерыванию сценария оболочки.
Версия 2
is_defined() {
: ${!1:?"parameter $1 null or unset"}
}
Только что протестировал на моем MinGW bash. :
Команда просто игнорирует все введенные данные, ничего не делает и возвращает успех. (Это имеет раздражающий побочный эффект - загрязнение вашего сообщения об ошибке, добавив к нему префикс sh: !1:
; использовать по собственному желанию.)