(обычно) правильный путь
if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi
где ${var+x}
- расширение параметра , которое ничего не вычисляет, если var
не установлено, и заменяет строку x
в противном случае.
Цитаты Отступление
Кавычки могут быть опущены (поэтому мы можем сказать ${var+x}
вместо "${var+x}"
), потому что этот синтаксис и использование гарантируют, что это будет расширяться только до чего-то, что не требует кавычек (поскольку оно либо расширяется до x
(которое содержит ни одно слово не разрывается, поэтому ему не нужны кавычки) или ничего (что приводит к [ -z ]
, что удобно для того же значения (true), что и [ -z "" ]
также)).
Однако, хотя кавычки могут быть безопасно опущены, и это было не сразу очевидно для всех (это даже не было очевидно для первого автора этого объяснения цитат , который также является основным Bash-кодером), иногда было бы лучше написать решение с кавычками как [ -z "${var+x}" ]
при очень небольшой возможной стоимости штрафа за скорость O (1). Первый автор также добавил это в качестве комментария рядом с кодом, использующим это решение, предоставив URL-адрес для этого ответа, который теперь также включает в себя объяснение того, почему кавычки можно безопасно опускать.
(часто) Неправильный путь
if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi
Это часто неверно, поскольку не различает переменную, которая не установлена, и переменную, для которой задана пустая строка. То есть, если var=''
, то вышеприведенное решение выведет "var is blank".
Различие между unset и «set to the empty string» является существенным в ситуациях, когда пользователь должен указать расширение или дополнительный список свойств, и если для них не указано их значение, по умолчанию используется непустое значение, тогда как указывается пустая строка должна заставить скрипт использовать пустое расширение или список дополнительных свойств.
Различие не может быть существенным в каждом сценарии, хотя. В этих случаях [ -z "$var" ]
будет просто отлично.