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

Как проверить действительность переменной среды с помощью проверки bash, существует ли она и является ли она истинной?

Я ищу тест, который вернет true если переменная среды определена и имеет значение, отличное от 0, false или NULL.

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

Примечание: ни при каких обстоятельствах bash не должен жаловаться на то, что переменная не определена или имеет странное значение, все, кроме 0, пустого, ложного или неопределенного, будет считаться истиной.

Такого теста не существует, как на языке высокого уровня, таком как Java или C #, но его относительно легко построить.

Три комментария к заданному вопросу:

1: вы не работаете с буквальными значениями "истина" / "ложь" в bash; все команды и условные конструкции дают статус выхода, или логический результат, который либо 0 (истина), либо не 0 (ложь).
Работайте с этим, не пытайтесь заново изобрести колесо.

2: Старайтесь не использовать имена параметров в верхнем регистре, если они не являются переменными среды; это простое соглашение, которое помогает содержать ваш код в чистоте.

3: Что именно вы подразумеваете под «NULL»? Буквальная строка НОЛЬ, пустое значение или что-то еще?
Последние две концепции не существуют в bash; а НОЛЬ переменная будет не задана, что вы уже проверяете.

Наиболее эффективным решением была бы функция, которая принимает переменную (или параметр, как их называет bash) и проверяет эти условия, а затем устанавливает статус выхода на основе этого, эффективно уплотняя несколько значений истинности до буквального 0 или 1.

Например:

is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }

  • is_true "1" дает 0, что верно
  • is_true "false" дает 1, что неверно
  • a=10; is_true "$a" дает 0
  • grep -q something somefile дает 0, если something появляется хотя бы раз в somefile.

ЗАМЕТЬТЕ, что последний пример ясно показывает, что вам не НУЖНА такая конструкция; все, что происходит в bash уже работает с этими базовыми значениями истинности 0/1.

Но я допускаю, что вам, возможно, придется преобразовать ввод из какой-то корявой внешней программы :)

Я считаю эти сравнения бесполезными, потому что они создают видимость кода неочевидной и неочевидной. Я просто использую приятную функцию bash, которая появилась с версии 4.2, из man-страницы:

   -v varname
          True if the shell variable varname is set (has been assigned a value).

Использование очень простое

OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
    exec > &>./logfile
    …
fi

Другими словами, чтобы пометить как включенный, просто определите. Попытайся!

$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && :          # no output
$ unset VAR && VAR= && :  # "existed"
$ unset VAR && VAR=1 && : # "existed"

Вы можете выполнить все три проверки с сопоставлением регулярного выражения (неопределенные параметры преобразуются в пустую строку):

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)