Существует ли хороший способ получить флажок с тремя состояниями в гибком проводе?

Я думаю ответ, который Вы, после подразумевается (если не указанный) [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]).

7
задан jawache 4 August 2009 в 12:18
поделиться