A melhor maneira de digitar isso seria:
while [ "$loop" = "true" ]
Leia a seção "Elaborando o teste-comando" no seguinte URL: link
Eu tenho o seguinte script:
while [ $loop == "true" ]
do
//do stuff
done
mas diz erro em [.
Também isso é executado como um daemon, quando o argumento stop é passado para o script ... o loop deve. Eu estou supondo que a configuração de $ loop para false acabará automaticamente com o loop.
A melhor maneira de digitar isso seria:
while [ "$loop" = "true" ]
Leia a seção "Elaborando o teste-comando" no seguinte URL: link
M. Vazquez-Abrams está certo. Isto não tem nada a ver com aspas fazendo coisas que são já strings em strings, ou alguma ideia equivocada que =
em bash
do comando [
embutido é outra coisa senão um comparação de string. (Leia o § 6.4 do Manual do Usuário do Bash, pessoas!) É tudo a ver com o que acontece com os campos vazios depois que a divisão de campo transforma palavras em campos.
Se a variável loop
da shell estiver vazia ou nula, então $loop
se expandirá para um campo vazio. Após a divisão de campo, os campos vazios são descartados. Observe que a divisão de campo e a verificação de campos vazios precede remoção de cotação. Portanto, "$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, antes e depois. 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 [
precisa que cinco esteja sintaticamente correto:
[
=
true
É claro que a string vazia não é igual à string de quatro caracteres ]
, 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.