Следующий код завершается с ошибкой несвязанной переменной. Как это исправить, продолжая использовать параметр set -o
существительного?
#!/bin/bash
set -o nounset
if [ ! -z ${WHATEVER} ];
then echo "yo"
fi
echo "whatever"
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
В этом случае, VALUE
если WHATEVER
не задано, становится пустой строкой . Мы используем {parameter:-word}
расширение, которое вы можете найти в man bash
разделе «Расширение параметров».
:-
проверяет, не задана ли переменная или пуста. Если вы хотите проверить только ли это снято с охраной, используйте-
:VALUE=${WHATEVER-}
. Кроме того, более читаемый способ проверить, пуста ли переменная:if [ "${WHATEVER+defined}" = defined ]; then echo defined; else echo undefined; fi
$WHATEVER
содержит только пробелы - см. Мой ответ.! -z
" вместо "-n
"?Вам нужно указать переменные, если вы хотите получить ожидаемый результат:
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
источник
"info bash"
,"${WHATEVER-}"
должны иметь":"
(двоеточие) перед"-"
(тире) , как:"${WHATEVER:-}"
и"${WHATEVER+defined}"
должны иметь двоеточие перед тем ,"+"
(плюс) , как:"${WHATEVER:+defined}"
. Для меня это работает в любом случае, с двоеточием или без него. В некоторых версиях nix это, вероятно, не будет работать без двоеточия, поэтому его, вероятно, следует добавить.-
,+
,:+
, и:-
все поддерживаются. Первое обнаружение ли переменная установлена , а последний обнаруживает ли он установлен или пустой . Fromman bash
: «Отсутствие двоеточия приводит к тестированию только для параметра, который не установлен».Как насчет одинарного лайнера?
[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"
-z
проверяет наличие пустой или неустановленной переменнойисточник
-z
только проверяет, пуст ли следующий параметр.-z
это просто аргумент[
команды. Расширение переменной происходит раньше, чем[ -z
может что-либо сделать.Предположения:
$ 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
Если вы хотите, чтобы неинтерактивный сценарий выводил ошибку и завершал работу, если переменная имеет значение null или не задана:
$ [[ "${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:?}" ]]
. Согласно примерам, это печатает ошибку и выходит, если переменная имеет значение NULL или не задана.источник
Ты можешь использовать
if [[ ${WHATEVER:+$WHATEVER} ]]; then
но
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
может быть более читабельным.
источник
=
оператор (POSIX) не==
для облегчения переносимости, а[
вместо него,[[
если это возможно.set -o nounset
специфичный для bash. Если вы поместите#!/bin/bash
вверху скрипта, лучше всего использовать улучшения bash.Хотя это не совсем тот вариант использования, о котором просили выше, я обнаружил, что если вы хотите использовать
nounset
(или-u
), поведение по умолчанию - это то, что вы хотите: выйти из ненулевого значения с описательным сообщением.Мне потребовалось достаточно времени, чтобы осознать это, и я решил, что это стоит опубликовать в качестве решения.
Если все, что вам нужно, - это повторить что-то еще при выходе или выполнить некоторую очистку, вы можете использовать ловушку.
В
:-
противном случае, вероятно, вам нужен оператор.источник