Shell script-выход из скрипта, если переменная равна null или пуста

Я ожидаю использовать нижеприведенную переменную в моем скрипте bash, но в случае, если это пусто или null, что было бы лучшим способом обработать его и выйти из скрипта.

tag=  

Я вижу ответы с "set-u". Я знаю, что это сработает, но хорошо ли это для производственной среды?

7 ответов


существует встроенный оператор для требования, чтобы переменная была установлена. Это приведет к выходу скрипта, если это не так.

tag=${1?Need a value}

обычно это используется с : no-op в начале сценария.

: ${1?Need a value}

сочетание "unset или пустой" несколько отличается. Аналогичной конструкции для выхода из пустого, но установленного значения нет, но вы можете легко использовать связанный синтаксис ${var:-default}, который расширяется до $var если он установлен и непустая, и default иначе. Существует также ${var-default} которая производит только default если переменная установлена правильно.

это может быть особенно полезно, когда вы хочу использовать set -u но нужно справиться с возможно unset переменной:

case ${var-} in '') echo ": Need a value in var" >&2; exit 1;; esac

я несколько предпочитаю case над if [ "${var-}" = '' ] главным образом потому, что это избавляет меня от необходимости обернуть в двойные кавычки ${var-}, и надоедливый случай значения в $var который интерпретируется как опция для [ и дает вам сообщение об ошибке, когда вы меньше всего этого ожидаете. (In Bash,[[ не имеет этих проблем; но я предпочитаю придерживаться оболочки POSIX, когда могу.)


Если вы хотите проверить, что переменная непустая, вы можете сделать следующее:

if [ -z "$tag" ]; then
    exit 1
fi

из руководства для test:

-з строку

длина строки равна нулю

учитывая, что вы используете позиционные аргументы скрипта, вы также можете проверить количество аргументов, которые вы получаете, посмотрев на $#.


никто не предлагал .

Если вы хотите убедиться, что переменная установлена, а не null:

SEARCH_PATH=${DAYS_TO_KEEP:?Must provide DAYS_TO_KEEP.}

немедленно выйдет с кодом 2 и напечатает сообщение:

/entrypoint.sh: line 17: SEARCH_PATH: Must provide DAYS_TO_KEEP.

Я не уверен, хотите ли вы определить, является ли переменная unset или empty. Это 2 разные вещи. В частности, переменная может быть установлена, но пуста:

$ var=""
$ if [ -z "$var" ]; then echo empty; fi
$ empty

то же самое происходит и здесь:

#!/usr/bin/env bash

set -u
echo 

мне понравилось, как Perl использует "die", и легко сделать что-то подобное в shell.

# Print (optional) error message and exit
# Usage: die [[msg] exit_status]
die() {
    [[ -n "" ]] && echo ""
    [[ -n "" ]] && exit  || echo 1
}

[[ -n "$tag" ]] || die "Need a tag argument.  Use  --help for details"

это предполагает оболочку bash или Korn, но может быть преобразовано в классическую оболочку Bourne путем изменения [[]] to [].


используйте сопоставление шаблонов, чтобы определить, состоит ли значение только из пробелов:

pattern=$'*( |\t)'
if [[  = $pattern ]]; then
    echo "First parameter has no non-whitespace characters"
    exit 1
fi

на $'...' цитирование упрощает добавление вкладки в строку. Расширенный шаблон *(...) соответствует 0 или более шаблонам внутри круглых скобок (подобно regex ( |\t)*). Шаблон присваивается переменной, потому что = выполняет точное соответствие строк, если какая-либо часть его правого операнда цитируется, поэтому мы выполняем цитирование заранее, чтобы упростить установку значение.


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

VAL= # Creates a NULL variable
if [[ -z "$VAL" && "$VAL" = ’’ ]]
then
echo "The VAL variable is NULL"
fi
or
VAL=25
if [[ ! -z "$VAL" && "$VAL" != ’’ ]]
then
echo "The VAL variable is NOT NULL"
fi