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