Проверьте, установлена ли переменная в bash при использовании "set -o nounset"
Следующий код завершается с несвязанной переменной. Как исправить это, используя параметр set -o
nounset?
#!/bin/bash
set -o nounset
if [ ! -z ${WHATEVER} ];
then echo "yo"
fi
echo "whatever"
Ответы
Ответ 1
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
В этом случае VALUE
заканчивается пустой строкой, если WHATEVER
не установлен. Мы используем расширение {parameter:-word}
, которое вы можете найти в man bash
в разделе "Расширение параметров".
Ответ 2
Вам нужно указать переменные, если вы хотите получить ожидаемый результат:
check() {
if [ -n "${WHATEVER-}" ]
then
echo 'not empty'
elif [ "${WHATEVER+defined}" = defined ]
then
echo 'empty but defined'
else
echo 'unset'
fi
}
Тест:
$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER=' '
$ check
not empty
Ответ 3
$ echo $SHELL
/bin/bash
$ /bin/bash --version | head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ set -o nounset
Если вы хотите, чтобы неинтерактивный script печатал ошибку и выходил, если переменная имеет значение null или не установлена:
$ [[ "${HOME:?}" ]]
$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set
$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set
Если вы не хотите, чтобы script вышел:
$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."
$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.
$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.
Вы даже можете использовать [
и ]
вместо [[
и ]]
выше, но последнее предпочтительнее в Bash.
Обратите внимание, что двоеточие делает выше. Из docs:
Иными словами, если двоеточие включено, оператор проверяет существование обоих параметров и что его значение не равно нулю; если двоеточие опущено, оператор проверяет только на существование.
По-видимому, нет необходимости в -n
или -z
.
В общем, я обычно могу просто использовать [[ "${VAR:?}" ]]
. В примерах это выводит ошибку и завершается, если переменная имеет значение null или не установлена.
Ответ 4
Как насчет oneliner?
[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"
-z
проверяет как пустую, так и не заданную переменную
Ответ 5
Вы можете использовать
if [[ ${WHATEVER:+$WHATEVER} ]]; then
но
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
может быть более читаемым.
Ответ 6
В то время как это не совсем так, как описано выше, я нашел, что если вы хотите использовать nounset
(или -u
), то по умолчанию вы хотите: вывести ненулевое с описательным сообщение.
Мне потребовалось достаточно времени, чтобы понять это, и я понял, что стоит опубликовать его как решение.
Если все, что вы хотите, должно повторить что-то еще при выходе или выполнить некоторую очистку, вы можете использовать ловушку.
Оператор :-
, вероятно, вы хотите иначе.