O Sr. Vazquez-Abrams está certo. Isso não é nada a ver com aspas fazendo coisas que são já cordas em cordas, ou alguma idéia equivocada de que =
em bash
's built-in [
comando é outra coisa senão uma comparação de cadeia. (Leia o parágrafo 6.4 do Manual do Usuário do Bash, pessoal!) Tudo tem a ver com o que acontece com os campos vazios após a divisão de campos transformar palavras em campos.
Se a variável do shell loop
estiver vazia ou nula, será $loop
expandida para um campo vazio. Após a divisão do campo, os campos vazios são descartados. Observe que a divisão de campos e a verificação de campos vazios precedem a remoção da cotação. Então, "$loop"
expande para o campo ""
, que não está vazio e, portanto, não é removido. Após a remoção da cotação, é então um campo vazio, que se torna um argumento vazio para o comando.
O [
comando requer que seu =
operador tenha dois operandos, anterior e posterior. Qualquer outra coisa é um erro de sintaxe. Como um campo vazio é removido, a sequência de palavras
[$ loop = true]
expande para
quatro campos
[
=
true
]
quando o [
comando precisar de cinco para estar sintaticamente correto:
[
-
=
true
]
Obviamente, a cadeia vazia não é igual à cadeia de quatro caracteres true
e o status de saída do comando é diferente de zero.
Novamente, tudo isso está no Manual do Usuário do Bash, em §3.5 e §3.5.7. O manual é seu amigo.