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

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

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

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

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

решение1

Такого теста не существует, как в языках высокого уровня, таких как 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.

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

решение2

Я считаю эти сравнения бесполезными, потому что они делают внешний вид кода неясным и неочевидным. Я просто использую приятную возможность 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"

решение3

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

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

Связанный контент