Проверка переменных среды - PullRequest
59 голосов
/ 06 июня 2010

Я пытаюсь проверить значение переменной окружения и в зависимости от значения делать определенные вещи, и это работает нормально, пока переменная установлена. Когда этого не происходит, я получаю целую кучу ошибок (поскольку 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

Мой вопрос: разве «unset TESTVAR» не должен его аннулировать? Кажется, это не так ...

Ответы [ 5 ]

114 голосов
/ 06 июня 2010

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

if [ "$TESTVAR" = "foo" ]

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

if [ "" = "foo" ]

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

if [  = "foo" ]

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

7 голосов
/ 08 июня 2010

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

if [ -n $TESTVAR ]

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

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

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

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

if [[ $TESTVAR ]]
7 голосов
/ 06 июня 2010

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

$ {параметр: -слово}
Используйте значения по умолчанию. Если параметр не установлен или равен нулю, разло- слово заменяется. В противном случае значение параметр замещен.

4 голосов
/ 06 июня 2010

В 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

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

2 голосов
/ 06 июня 2010

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

  • "$ TESTVAR"
  • X $ TESTVAR == Xy
  • $ {TESTVAR: - ''}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...