Я думаю , що відповідь ви після Мається на увазі (якщо не вказано інше) на Вінко «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
).