Тест Если переменная UnseT

Чтобы переносимо отрицать сложное условие в shell, вы должны либо применить закон Де Моргана и продвинуть отрицание вниз внутри [ вызовов ...

if [ ! -f file1 ] || [ ! -f file2 ] || [ ! -f file3 ]
then
    # do stuff
fi

... или вы должны использовать then :; else ...

if [ -f file1 ] && [ -f file2 ] && [ -f file3 ]
then :
else
  # do stuff
fi

если ! команда не является переносимой, как и [[]...

Если вам не нужна полная переносимость, не пишите сценарий оболочки. На самом деле больше шансов найти /usr/bin/perl на случайно выбранном Unix, чем bash.

7
30.08.2018, 13:29
2 ответа

POSIX определяет различные расширения параметров для проверки того, не установлен ли параметр.

Следующее расширение параметра может использоваться для проверки того, не установлен ли параметр. Вторая часть (после вопросительного знака )может указывать на то, что параметр varне установлен.

echo ${var?parameter not set}
-sh: var: parameter not set

Обратите внимание, что использование неопределенного параметра может быть ошибкой программирования.

prompt% sh -u script   # or set -o nounset
0
27.01.2020, 20:14

Для скалярных переменных в стандартном синтаксисе (POSIX)sh:

if [ "${var+set}" != set ]; then
  echo var is not set
fi

Или более изящные, хотя и менее разборчивые вещи, такие как

if [ -z "${var++}" ]; then
  echo var is unset
fi

Или:

if ${var+false}; then
  echo var is unset
fi

Для переменных-массивов (не то, что массивы являются переносимыми ), в zshили yash, которые будут возвращать значение unset, если только массиву не назначен какой-либо список, включая пустой список, в то время как в bash или ksh, который вернет unset , если не установлен элемент с индексом 0. То же самое для ассоциативных массивов (для ключа "0" ).

Обратите внимание, что за исключением zsh(, когда не в shэмуляция ), export varилиreadonly varобъявляет переменную, но не дает ей никакого значения, поэтому оболочки, отличные от zshсообщит varкак unsetтам (, если varне было присвоено значение до вызова export/readonly).

18
27.01.2020, 20:14

Теги

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