Подтвердить что ты не робот

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

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

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

#!/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" его свести на нет? Кажется, это не так...

4b9b3361

Ответ 1

Вставьте переменную в двойные кавычки.

if [ "$TESTVAR" = "foo" ]

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

if [ "" = "foo" ]

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

if [  = "foo" ]

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

Ответ 2

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

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

Ответ 3

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

if [ -n $TESTVAR ]

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

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

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

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

if [[ $TESTVAR ]]

Ответ 4

В 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

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

 "$TESTVAR"
 X$TESTVAR == Xy
 ${TESTVAR:-''}