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