
Я ищу тест, который вернет результат, 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"
дает 0grep -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|)$ ]]
)