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

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

tag=$1  

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

Ответ 1

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

tag=${1?Need a value}

Обычно это используется с : no-op рядом с началом script.

: ${1?Need a value}

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

Это может быть особенно полезно, если вы хотите использовать set -u, но вам нужно справиться с возможной неустановленной переменной:

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

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

Ответ 2

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

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

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

-z STRING

длина STRING равна нулю

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

Ответ 3

Никто не предложил :? вариант.

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

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

Сразу выйдет с кодом 2 и распечатает сообщение:

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

Ответ 4

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

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

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

#!/usr/bin/env bash

set -u
echo $1

Тест:

$ ./test.sh
./test.sh: line 4: $1: unbound variable
$ ./test.sh ""

$

Или здесь:

#!/usr/bin/env bash

tag=${1?Need a value}
echo $tag

Тест:

$ ./se.sh
./se.sh: line 3: 1: Need a value
$ ./se.sh ""

$

Другие плакаты представили правильные способы обнаружения несвязанной и пустой переменной. Лично мне нравится этот способ обнаружения пустых и неустановленных переменных:

#!/usr/bin/env bash

if [ "$1"A = A ]
then
    echo variable is empty or unset
fi

Тест:

$ ./empty.sh ""
variable is empty or unset
$ ./empty.sh
variable is empty or unset
$ ./empty.sh 1
$

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

Следующий тест гарантирует, что переменная имеет значение 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