Я думаю , що відповідь ви після Мається на увазі (якщо не вказано інше) на Вінко «s відповідь , хоча це не прописано просто. Щоб визначити, чи встановлено 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}позначення. Дітто для ${VAR-value}і ${VAR:-value}, і ${VAR+value}і ${VAR:+value}, і так далі.
Як вказує Гілі у своїй відповіді , якщо ви біжите bashз set -o nounsetваріантом, то основна відповідь вище не вдається unbound variable. Це легко виправити:
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опцію за допомогою set +u( set -uщо еквівалентно set -o nounset).