Проверьте, установлена ​​ли переменная в bash при использовании "set -o nounset" - PullRequest
77 голосов
/ 20 октября 2011

Следующий код завершается с ошибкой несвязанной переменной.Как это исправить, все еще используя опцию set -o nounset?

#!/bin/bash

set -o nounset

if [ ! -z ${WHATEVER} ];
 then echo "yo"
fi

echo "whatever"

Ответы [ 6 ]

72 голосов
/ 20 октября 2011
#!/bin/bash

set -o nounset


VALUE=${WHATEVER:-}

if [ ! -z ${VALUE} ];
 then echo "yo"
fi

echo "whatever"

В этом случае VALUE заканчивается пустой строкой, если WHATEVER не задано.Мы используем расширение {parameter:-word}, которое вы можете найти в man bash в разделе «Расширение параметров».

26 голосов
/ 22 марта 2012

Вам нужно заключить переменные в кавычки, если вы хотите получить ожидаемый результат:

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
6 голосов
/ 03 апреля 2014

Предположения:

$ 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

Если вы хотите, чтобы неинтерактивный скрипт выводил ошибку и завершал работу, если переменная равна нулю или не установлена:

$ [[ "${HOME:?}" ]]

$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set

$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set

Если вы не хотите, чтобы скрипт завершал работу:

$ [[ "${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.

Обратите внимание, что двоеточие делает выше. Из документов :

Другими словами, если двоеточие включено, оператор проверяет наличие как параметра, так и того, что его значение не равно нулю; если двоеточие опущено, оператор проверяет только наличие.

Очевидно, нет необходимости в -n или -z.

В целом, я обычно могу просто использовать [[ "${VAR:?}" ]]. В соответствии с примерами, это печатает ошибку и завершается, если переменная равна нулю или не установлена.

5 голосов
/ 29 июня 2012

Как насчет oneliner?

[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"

-z проверяет как пустую, так и неустановленную переменную

3 голосов
/ 22 марта 2012

Вы можете использовать

if [[ ${WHATEVER:+$WHATEVER} ]]; then

но

if [[ "${WHATEVER:+isset}" == "isset" ]]; then

может быть более читабельным.

0 голосов
/ 17 ноября 2016

Хотя это не точно вариант использования, о котором говорилось выше, я обнаружил, что если вы хотите использовать nounset (или -u), то поведение по умолчанию - это то, что вам нужно: выйти из нуля с описательным сообщением.

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

Если все, что вам нужно - это эхом что-то еще при выходе или выполнить некоторую очистку, вы можете использовать ловушку.

Оператор :-, вероятно, то, что вы хотите в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...