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