Я хотел бы добавить, что AFAIK это был только допустимый шаблон для одноточечной версии Visual Basic, и даже , что был несколько спорным. (IIRC это было только для объектов DAO.)
Я думаю ответ, который Вы, после подразумевается (если не указанный) [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]).
~> if [ -z $FOO ]; then echo "EMPTY"; fi
EMPTY
~> FOO=""
~> if [ -z $FOO ]; then echo "EMPTY"; fi
EMPTY
~> FOO="a"
~> if [ -z $FOO ]; then echo "EMPTY"; fi
~>
-z работает на неопределенные переменные также. Для различения неопределенное и определенный, Вы использовали бы вещи, перечисленные здесь или, с более четкими объяснениями, здесь .
Самый Чистый путь использует расширение как в этих примерах. Для получения всех опций проверяют раздел Parameter Expansion руководства.
Альтернативное слово:
~$ unset FOO
~$ if test ${FOO+defined}; then echo "DEFINED"; fi
~$ FOO=""
~$ if test ${FOO+defined}; then echo "DEFINED"; fi
DEFINED
Значение по умолчанию:
~$ FOO=""
~$ if test "${FOO-default value}" ; then echo "UNDEFINED"; fi
~$ unset FOO
~$ if test "${FOO-default value}" ; then echo "UNDEFINED"; fi
UNDEFINED
, Конечно, Вы использовали бы один из них по-другому, помещая значение, которое Вы хотите вместо 'значения по умолчанию' и использования расширения непосредственно, в подходящих случаях.
назовите набор без любых аргументов.. это производит весь определенный Вар..
последние в списке были бы теми определенными в Вашем сценарии..
, таким образом, Вы могли передать его вывод по каналу к чему-то, что могло выяснить, какие вещи определяются и что не