М. Васкес-Абрамс совершенно прав. Это не имеет ничего общего с кавычками, превращающими вещи, которые уже являются строками, в строки, или с какой-то ошибочной идеей, что = во встроенной команде bash [ это что-то кроме сравнения строк. (Читайте § 6.4 Руководства пользователя Bash, люди!) Это все, что связано с тем, что происходит с пустыми полями после того, как расщепление полей превращает слова в поля.
Если переменная loop shell пуста или равна нулю, то $loop расширяется до пустого поля. После разделения поля пустые поля отбрасываются. Обратите внимание, что разделение полей и проверка пустых полей предшествуют удалению кавычек. Таким образом, "$loop" расширяется до поля "" , которое не является пустым и, следовательно, не удаляется. После удаления кавычки это пустое поле, которое становится пустым аргументом команды.
Команда [ требует, чтобы у оператора = было два операнда, вперед и назад. Все остальное является синтаксической ошибкой. Поскольку пустое поле удаляется, последовательность слов
[ $loop = true ]
расширяется до
четырех полей
[
=
true
]
когда команде [ нужно пять синтаксически правильных команд:
[
-
=
true
]
Конечно, пустая строка не равна четырехзначной строке true , а состояние выхода команды не равно нулю.
Опять же, все это есть в Руководстве пользователя Bash, в §3.5 и §3.5.7. Руководство - твой друг.