Операторы оболочки, отличные от нуля (-n) и нулевой длины (-z), возвращают True для одной и той же переменной !!! непостижимый - PullRequest
1 голос
/ 29 января 2020

Почему ненулевой и нулевой оператор возвращают true в сценарии оболочки? Это не имеет никакого смысла. Пожалуйста, посмотрите следующий небольшой скрипт, который я написал. Я установил переменную 'ноль', чтобы ничего не было. Я также получаю те же результаты, если установить «ноль» на «» или zero="".

zero=

#the below code prints - "is not length zero"
if [ -n $zero ] ; 
then      
 echo "$zero is not length zero" ; 
fi

#the below code prints - " is length 0" 
if [ -z $zero ] ; then     echo "$zero is length 0";  fi  

Спасибо, что прочитали это. Пожалуйста, смейся надо мной, пока я не потеряю все чувство реальности.

С уважением,

1 Ответ

0 голосов
/ 03 февраля 2020

Заключайте в кавычки переменные, когда они используются с операторами сравнения в тестовых скобках

Из-за разбиения строк всегда рекомендуется заключать в кавычки переменные, если переменная содержит пробел.

В случае операторов сравнения это приведет к сбою, если вы этого не сделаете.

Документы LDP для оператора n фактически указывают ' Тест -n требует, чтобы строка заключалась в кавычки в тестовых скобках. '

Вот обновленная версия кода, которая работает, как и ожидалось:

#!/usr/bin/env bash


zero= # Zero-length ("null") string variable.

#the below code prints $zero is null.

echo "Test for zero length using -n comparison operator"
if [ -n "$zero" ] ; # if string is not null
then
 echo "\$zero is not null" ;
else
echo "\$zero is null"
fi

echo "Test for zero length using -z comparison operator"
#the below code prints $zero is null.


if [ -z "$zero" ]
then
  echo "\$zero is null."
else
  echo "\$zero is NOT null."
fi

ссылка на оператор

  • Оператор сравнения -n проверяет, не является ли строка нулевой
  • Оператор сравнения -z делает обратное, возвращая true, если строка null, то есть имеет нулевую длину.
  • LDP - 7.3 Другие операторы сравнения
...