Тестирование, чтобы увидеть, установлена ​​ли переменная env в bash - PullRequest
3 голосов
/ 22 сентября 2011

В bash-скрипте я пытаюсь проверить наличие переменной. Но независимо от того, что я делаю, мой тест «если» возвращает true. Вот код:

ignored-deps-are-not-set () {
    if [ -z "${ignored_deps+x}" ]
    then
        return 0
    fi
    return 1
}

ignored_deps=1
ignored-deps-are-not-set
echo "ignored-deps function returns: $?"
if [ ignored-deps-are-not-set ]
then
    echo "variable is unset"
else
    echo "variable exists"
fi

Вот вывод как написано:

ignored-deps function returns: 1
variable is unset

И вывод, когда я закомментирую строку, где установлено ignored_deps.

ignored-deps function returns: 0
variable is unset

Неважно, что переменная не установлена. Чего мне не хватает?

Ответы [ 5 ]

5 голосов
/ 22 сентября 2011

Эта строка:

if [ ignored-deps-are-not-set ]

проверяет, является ли строка ignored-deps-are-not-set пустой или нет. Возвращает true, потому что строка не пуста. Он не выполняет команду (и, следовательно, функцию).

Если вы хотите проверить, установлена ​​ли переменная, используйте одно из обозначений ${variable:xxxx}.

if [ ${ignored_deps+x} ]
then echo "ignored_deps is set ($ignored_deps)"
else echo "ignored_deps is not set"
fi

Обозначение ${ignored_deps+x} оценивается как x, если установлено $ignored_deps, даже если оно установлено в пустую строку. Если вы хотите установить только непустое значение, используйте также двоеточие:

if [ ${ignored_deps:+x} ]
then echo "ignored_deps is set ($ignored_deps)"
else echo "ignored_deps is not set or is empty"
fi

Если вы хотите выполнить функцию (при условии, что в имени функции работает тире), то:

if ignored-deps-are-not-set
then echo "Function returned a zero (success) status"
else echo "Function returned a non-zero (failure) status"
fi
2 голосов
/ 22 сентября 2011

Вы на самом деле не выполняете функцию:

if ignored-deps-are-not-set; then ...

В скобках [] буквенная строка «ignored-deps-not-set» рассматривается как true.

0 голосов
/ 23 сентября 2011

Еще один способ проверить наличие переменной:

if compgen -A variable test_existence_of_var; then 
   echo yes
else 
   echo no
fi
0 голосов
/ 22 сентября 2011

- edit-- только что понял, что это функция, которую вы пытаетесь вызвать, соглашение неверно.

См:

Z000DGQD@CND131D5W6 ~
$ function a-b-c() {
> return 1
> }

Z000DGQD@CND131D5W6 ~
$ a-b-c

Z000DGQD@CND131D5W6 ~
$ echo $?
1

Z000DGQD@CND131D5W6 ~
$ if a-b-c; then echo hi; else echo ho; fi
ho

Z000DGQD@CND131D5W6 ~
$ if [ a-b-c ]; then echo hi; else echo ho; fi
hi

Z000DGQD@CND131D5W6 ~

- редактировать конец -

Исправьте имя переменной (см. Мой комментарий к вашему сообщению)

1010 * тогда *

См. Расширение параметра раздел в man bash.

${parameter:?word}:

Показать ошибку, если ноль или не установлен. Если параметр равен нулю или не задан, расширение слова (или сообщение на этот счет, если слово отсутствует) записывается со стандартной ошибкой, и оболочка, если она не является интерактивной, завершается. В противном случае значение параметра подставляется.

0 голосов
/ 22 сентября 2011
if [ ${myvar:-notset} -eq "notset" ] then
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...