script bash while loop se variável for verdadeira

2

Eu tenho o seguinte script bash:

while [ $loop == "true" ]
   do
     //do stuff
   done

mas diz erro em [.

Além disso, isso é executado como um daemon, quando o argumento de parada é passado para o script ... o loop deve. Eu estou supondo que definir $ loop como false terminará automaticamente o loop.

pássaro de fogo
fonte
"... diz erro em [." Realmente?
Ignacio Vazquez-Abrams
Tenha -1 para não fornecer nem descrever adequadamente a mensagem de erro.
JdeBP

Respostas:

1

A melhor maneira de digitar isso seria:

while [ "$loop" = "true" ]

Leia a seção "Elaborando o comando test" na seguinte URL:
http://wiki.bash-hackers.org/syntax/quoting

Mattias Ahnberg
fonte
2
Todos os valores no bash são cadeias de caracteres. As citações não têm nada a ver com isso.
Ignacio Vazquez-Abrams
2
As aspas fazem funcionar. E = compara cadeias, em comparação com (por exemplo) -eq que compara números inteiros. Consulte o Guia Avançado Bash Scripting para mais informações "Note-se que a comparação inteiro e seqüência de usar um conjunto diferente de operadores.": Tldp.org/LDP/abs/html/comparison-ops.html
Mattias Ahnberg
Ou então, você está certo, o "" em si não o torna uma string, você também pode usar: $ loop = true mas o bash ainda faz diferença entre strings e números inteiros. Atualizou a resposta um pouco.
Mattias Ahnberg
6
Você sabe, dizer a alguém que eles estão errados sem explicar e corrigir corretamente é meio inútil e idiota?
Mattias Ahnberg
1
Ou, como diria o GreyCat: Use mais citações!
L0b0
5

O Sr. Vazquez-Abrams está certo. Isso não é nada a ver com aspas fazendo coisas que são 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 loopestiver vazia ou nula, será $loopexpandida 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

  1. [
  2. =
  3. true
  4. ]

quando o [comando precisar de cinco para estar sintaticamente correto:

  1. [
  2.  
  3. =
  4. true
  5. ]

Obviamente, a cadeia vazia não é igual à cadeia de quatro caracteres truee 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.

JdeBP
fonte
Ah, sim, é claro que você está certo. Bem colocado! Aprecio muito mais esses tipos de correções e explicações do que os comentários arrogantes do Sr. Vazquez-Abrams, apenas apontando que alguém está errado sem se preocupar em explicar ou esclarecer. Dificilmente útil. Eu me expressei mal ao converter para string, mas quis dizer que há uma diferença entre strings e números inteiros na maneira como você deve colocá-los em loop. E eu sempre tenho o hábito de colocar meus testes / strings dentro "" para lidar com os espaços corretamente. :) Eu também assumi erroneamente que $ loop foi definido como "true", embora possa não ter sido.
Mattias Ahnberg