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.