Вы вообще не проводите сравнение, потому что вы не используете кавычки там, где они обязательны. См. Предупреждение от http://shellcheck.net/ о расширениях без кавычек в SC2086 .
Если обе строки пусты, то:
[ $str1 != $str2 ]
... оценивается в ...
[ != ]
... который проверяет, является ли строка !=
непустой, что верно. Измените свой код на:
[ "$str1" != "$str2" ]
... и точные значения этих строк будут фактически переданы в команду [
.
Другая альтернатива - использование [[
; как описано в BashFAQ # 31 и на странице условных выражений в вики bash-hackers , это расширенный синтаксис оболочки (в ksh, bash и других распространенных оболочках, расширяющих POSIX sh стандартный), который подавляет поведение расщепления строк, которое вас сбивает с толку:
[[ $str1 != "$str2" ]]
... требует, чтобы кавычки были только в правой части, и даже те, которые не нужны для случая с пустой строкой, но для предотвращения того, чтобы эта правая часть рассматривалась как глобус (вызывая сравнение всегда отобразить совпадение, если str2='*'
).