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