Come creare un ciclo for nella riga di comando?

Prendiamo un semplice for loop

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

AFAIK il punto e virgola negli script bash fa sì che la shell esegua il comando corrente in modo sincrono e poi passi a quello successivo. p>

Allora perché la shell non può “t interpretare la seguente riga

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

come funziona questo for loop in realtà funziona?

Risposta

La sintassi di un ciclo for dal bash pagina di manuale è

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

Il punto e virgola può essere sostituito con ritorni a capo, come indicato altrove nel bash pagina di manuale: “Una sequenza di una o più nuove righe potrebbe apparire in un elenco invece di un punto e virgola per delimitare i comandi.”

Tuttavia, non è vero il contrario; non puoi sostituire arbitrariamente le nuove righe con punto e virgola. Il tuo script su più righe può essere convertito in una singola riga purché osservi le regole di sintassi sopra e non inserisci un punto e virgola in più dopo do:

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

Commenti

  • Lo script finale è sbagliato, come ha sottolineato @ dr01, devi rimuovere il punto e virgola dopo do.
  • @jake, questo dice anche che devi rimuovere il punto e virgola dopo do. Inoltre, questa risposta spiega perché è necessario rimuovere il punto e virgola dopo “do '.
  • E se $i deve essere parte di un nome file? Sono necessarie le virgolette doppie?
  • filename_${i} quindi
  • @ user4556274 secondo la sintassi " for I do; done " dovrebbe funzionare allo stesso modo. perché ' non è così?

Risposta

Il punto e virgola dopo do è un errore e non dovrebbe essere presente.

Quanto segue funziona correttamente:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *