Я думаю ответ, который Вы, после подразумевается (если не указанный) [1 125] ответ Vinko , хотя это не разъяснено просто. Чтобы различать, установлен ли VAR, но пуст или не набор, можно использовать:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
, вероятно, можно объединить два теста на второй строке в одну с:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Однако при чтении документации для Autoconf Вы найдете, что они не рекомендуют комбинировать условия с' -a
' и действительно рекомендуют использовать отдельные простые тесты, объединенные с &&
. Я не встретился с системой, где существует проблема; это не означает, что они не сделали используемый для существования (но они, вероятно, чрезвычайно редки в эти дни, даже если они не были так же редки в удаленном прошлом).
можно найти детали их и другое связанное расширения параметра оболочки , test
или [
команда и условные выражения в руководстве Bash.
меня недавно спросили по электронной почте об этом ответе с вопросом:
Вы используете два теста, и я понимаю второй хорошо, но не первый. Более точно я не понимаю потребность в переменном расширении
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
, разве это не выполнило бы то же?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Справедливый вопрос - ответ 'нет, Ваша более простая альтернатива не делает того же самого'.
предположим я пишу это перед Вашим тестом:
VAR=
Ваш тест скажет, что "VAR не установлен вообще", но мой скажет (косвенно, потому что это отзывается эхом, ничто) "VAR установлен, но его значение могло бы быть пустым". Попробуйте этот сценарий:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
вывод:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
Во второй паре тестов, переменная установлена, но это установлено на пустое значение. Вот в чем разница, которое ${VAR=value}
и ${VAR:=value}
делают нотации. Так же для [1 114] и ${VAR:-value}
, и ${VAR+value}
и ${VAR:+value}
, и так далее.
Как [1 130] Gili указывает в его ответ , если Вы работаете bash
с set -o nounset
опция, тогда основной ответ выше сбоев с [1 120]. Это легко исправлено:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Или Вы могли отменить set -o nounset
опция с [1 122] (set -u
являющийся эквивалентным [1 124]).
Пример размещен здесь в Flex Cookbook. Вы можете легко создать свой собственный компонент из этого кода.