Cum se face o buclă pentru linia de comandă?

Să luăm un simplu for loop

#!/bin/bash for i in `seq 1 10`; do echo $i done 

Punctul și virgula AFAIK din scripturile bash face ca shellul să execute comanda curentă în mod sincron și apoi să treacă la următoarea. Apăsând Enter face literal la fel, cu excepția faptului că nu vă permite să introduceți următoarea comandă, spălând imediat bufferul. p>

Deci, de ce shell nu poate „interpreta următoarea linie

for i in `seq 1 10`; do; echo $i; done 

cum funcționează de fapt acest for loop funcționează?

Răspuns

Sintaxa unei bucle for din bash pagina manuală este

for name [ [ in [ word ... ] ] ; ] do list ; done 

Punctele și virgulele pot fi înlocuite cu retururi de transport, după cum se menționează în altă parte în bash pagină manuală: „O listă de una sau mai multe linii noi poate apărea într-o listă în loc de punct și virgulă pentru a delimita comenzile.”

Cu toate acestea, inversul nu este adevărat; nu puteți înlocuiți în mod arbitrar noile linii cu punct și virgulă. Scriptul dvs. multiliniu poate fi convertit într-o singură linie atâta timp cât respectați regulile de sintaxă de mai sus și nu introduceți un punct și virgulă suplimentar după do:

for i in `seq 1 10`; do echo $i; done 

Comentarii

  • Scriptul final este greșit, așa cum a subliniat @ dr01, trebuie să eliminați punctul și virgula după do.
  • @jake, aceasta mai spune că trebuie să eliminați punctul și virgula după do. În plus, acest răspuns explică de ce trebuie să eliminați punctul și virgula după `do '.
  • Ce se întâmplă dacă $i trebuie să facă parte dintr-un nume de fișier? Are nevoie de ghilimele duble?
  • faceți filename_${i} apoi
  • @ user4556274 conform sintaxei " for i do; done " ar trebui să funcționeze și el. de ce nu ' este?

Răspunde

Punctul și virgula după do este o eroare și nu ar trebui să fie acolo.

Următoarele funcționează corect:

for i in `seq 1 10`; do echo $i; done 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *