Проверка переменные среды

Я пытаюсь проверить, что значение переменной среды и в зависимости от значения делает определенные вещи, и это хорошо работает, пока переменная установлена. Когда это не, хотя я получаю целый набор ошибок (поскольку Bash пытается сравнить строку, я указываю с неопределенной переменной, я предполагаю),

Я пытался реализовать дополнительную проверку для предотвращения его случай, но никакая удача. Блок кода, который я использую:

#!/bin/bash

if [ -n $TESTVAR ]
then
  if [ $TESTVAR == "x" ]
  then
    echo "foo"
    exit
  elif [ $TESTVAR == "y" ]
  then
    echo "bar"
    exit
  else
    echo "baz"
    exit
  fi
else
  echo -e "TESTVAR not set\n"
fi

И это - вывод:

$ export TESTVAR=x
$ ./testenv.sh 
foo
$ export TESTVAR=y
$ ./testenv.sh 
bar
$ export TESTVAR=q
$ ./testenv.sh 
baz
$ unset TESTVAR
$ ./testenv.sh 
./testenv.sh: line 5: [: ==: unary operator expected
./testenv.sh: line 9: [: ==: unary operator expected
baz

Мой вопрос, не должен 'сбрасывать TESTVAR', аннулируют его? Это, кажется, не имеет место...

62
задан Dave Newton 1 March 2013 в 13:05
поделиться

5 ответов

Заключите переменную в двойные кавычки.

if [ "$TESTVAR" = "foo" ]

, если вы сделаете это, а переменная пуста, тест расширится до:

if [ "" = "foo" ]

, тогда как если вы не укажете его, он расширится до:

if [  = "foo" ]

, что является синтаксической ошибкой.

119
ответ дан 24 November 2019 в 16:40
поделиться

Посмотрите раздел "Расширение параметров", вы найдете такие вещи, как:

${параметр:-слово}
. Использовать значения по умолчанию. Если параметр не задан или равен нулю, то при расширении параметра по умолчанию используется функция expan- значение слова будет заменено. В противном случае подставляется значение параметра заменяется.

8
ответ дан 24 November 2019 в 16:40
поделиться

В Bash (а также в ksh и zsh), если вы используете двойные квадратные скобки, вам не нужно заключать переменные в кавычки для защиты от того, что они могут быть нулевыми или несброшенными.

$ if [ $xyzzy == "x" ]; then echo "True"; else echo "False"; fi
-bash: [: ==: unary operator expected
False
$ if [[ $xyzzy == "x" ]]; then echo "True"; else echo "False"; fi
False

Есть и другие преимущества.

5
ответ дан 24 November 2019 в 16:40
поделиться

После интерпретации отсутствующего TESTVAR вы оцениваете [ == "y" ]. Попробуйте любой из:

 "$TESTVAR"
 X$TESTVAR == Xy
 ${TESTVAR:-''}
3
ответ дан 24 November 2019 в 16:40
поделиться

Ваш тест, чтобы увидеть, установлено ли значение

if [ -n $TESTVAR ]

, на самом деле просто проверяет, установлено ли значение не на пустую строку . Обратите внимание:

$ unset asdf
$ [ -n $asdf ]; echo $?
0
$ [ -n "" ]; echo $?
1
$ [ -n "asdf" ]; echo $?
0

Помните, что 0 означает Истина.

Если вам не нужна совместимость с исходной оболочкой Bourne, вы можете просто изменить это первоначальное сравнение на

if [[ $TESTVAR ]]
7
ответ дан 24 November 2019 в 16:40
поделиться