Как определить, не определена ли строка в сценарии оболочки bash?

Я хотел бы добавить, что AFAIK это был только допустимый шаблон для одноточечной версии Visual Basic, и даже , что был несколько спорным. (IIRC это было только для объектов DAO.)

148
задан Mark Biek 23 October 2008 в 04:28
поделиться

3 ответа

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

134
ответ дан Community 23 October 2008 в 04:28
поделиться
~> 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

, Конечно, Вы использовали бы один из них по-другому, помещая значение, которое Вы хотите вместо 'значения по умолчанию' и использования расширения непосредственно, в подходящих случаях.

36
ответ дан Vinko Vrsalovic 23 October 2008 в 04:28
поделиться

назовите набор без любых аргументов.. это производит весь определенный Вар..
последние в списке были бы теми определенными в Вашем сценарии..
, таким образом, Вы могли передать его вывод по каналу к чему-то, что могло выяснить, какие вещи определяются и что не

-3
ответ дан Aditya Mukherji 23 October 2008 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: