Чтобы переносимо отрицать сложное условие в 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
.
POSIX определяет различные расширения параметров для проверки того, не установлен ли параметр.
Следующее расширение параметра может использоваться для проверки того, не установлен ли параметр. Вторая часть (после вопросительного знака )может указывать на то, что параметр var
не установлен.
echo ${var?parameter not set}
-sh: var: parameter not set
Обратите внимание, что использование неопределенного параметра может быть ошибкой программирования.
prompt% sh -u script # or set -o nounset
set
специальный встроенный -в спецификации POSIX . Для скалярных переменных в стандартном синтаксисе (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
).