Come creare un ciclo for nella riga di comando?


22

Facciamo un semplice for loop

#!/bin/bash

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

Il punto e virgola AFAIK negli script bash fa sì che la shell esegua il comando corrente in modo sincrono e quindi passi al successivo. La pressione di invio fa letteralmente lo stesso, tranne per il fatto che non consente di immettere il seguente comando, svuotando immediatamente il buffer.

Quindi perché la shell non può interpretare la seguente riga

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

come funziona for loopdavvero?

Risposte:


16

La sintassi di un forloop dalla bashpagina del manuale è

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

I punti e virgola possono essere sostituiti con ritorni a capo, come indicato altrove nel bash capo pagina manuale: "Una sequenza di una o più nuove righe può apparire in un elenco anziché un punto e virgola per delimitare i comandi."

Tuttavia, non è vero il contrario; non è possibile sostituire arbitrariamente le nuove righe con punti e virgola. Lo script multilinea può essere convertito in una riga singola purché si osservino le regole di sintassi sopra riportate e non si inserisca un punto e virgola aggiuntivo dopo do:

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

2
Lo script finale è errato, come sottolineato da @ dr01, è necessario rimuovere il punto e virgola dopo do.
Jake,

1
@jake, questo dice anche che è necessario rimuovere il punto e virgola dopo do. Inoltre, questa risposta spiega perché è necessario rimuovere il punto e virgola dopo `do '.
user4556274

Cosa succede se è $inecessario far parte del nome di un file? Ha bisogno di virgolette doppie?
Anonimo

18

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

Di seguito funziona correttamente:

for i in `seq 1 10`; do echo $i; done 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.