Почему две пустые строки сравниваются как не равные? - PullRequest
0 голосов
/ 01 мая 2019
my@comp:~/wtfdir$ cat wtf.sh
str1=$(echo "")
str2=$(echo "")

if [ $str1 != $str2 ]; then
  echo "WTF?!?!"
fi
my@comp:~/wtfdir$ ./wtf.sh
WTF?!?!
my@comp:~/wtfdir$

WTF здесь происходит?!

Как я написал вышеприведенный код: поиск в Google "bash сравнить строки" привел меня на этот сайт , который говорит:

Вы можете проверить равенство и неравенство двух строк в bash с помощью оператора if.«==» используется для проверки равенства, а «! =» Используется для проверки неравенства строк.

И все же я получаю вышеуказанное?

Чем я не являюсьпонимание?Что я делаю не так?

1 Ответ

9 голосов
/ 01 мая 2019

Вы вообще не проводите сравнение, потому что вы не используете кавычки там, где они обязательны. См. Предупреждение от http://shellcheck.net/ о расширениях без кавычек в SC2086 .

Если обе строки пусты, то:

[ $str1 != $str2 ]

... оценивается в ...

[ != ]

... который проверяет, является ли строка != непустой, что верно. Измените свой код на:

[ "$str1" != "$str2" ]

... и точные значения этих строк будут фактически переданы в команду [ .


Другая альтернатива - использование [[; как описано в BashFAQ # 31 и на странице условных выражений в вики bash-hackers , это расширенный синтаксис оболочки (в ksh, bash и других распространенных оболочках, расширяющих POSIX sh стандартный), который подавляет поведение расщепления строк, которое вас сбивает с толку:

[[ $str1 != "$str2" ]]

... требует, чтобы кавычки были только в правой части, и даже те, которые не нужны для случая с пустой строкой, но для предотвращения того, чтобы эта правая часть рассматривалась как глобус (вызывая сравнение всегда отобразить совпадение, если str2='*').

...