Получить из строки в переменную в 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:; использовать по собственному желанию.)

Другие вопросы по тегам