Prenons un simple for loop
#!/bin/bash for i in `seq 1 10`; do echo $i done
Le point-virgule AFAIK dans les scripts bash permet au shell dexécuter la commande actuelle de manière synchrone, puis de passer à la suivante. Appuyer sur Entrée fait littéralement la même chose sauf que cela ne vous permet pas dentrer la commande suivante, vidant immédiatement le tampon. p>
Alors pourquoi le shell ne peut « t interpréter la ligne suivante
for i in `seq 1 10`; do; echo $i; done
comment cela for loop
en fait fonctionne?
Réponse
La syntaxe dune boucle for
de la bash
page de manuel est
for name [ [ in [ word ... ] ] ; ] do list ; done
Les points-virgules peuvent être remplacés par des retours chariot, comme indiqué ailleurs dans bash
page de manuel: « Une séquence dun ou plusieurs sauts de ligne peut apparaître dans une liste au lieu dun point-virgule pour délimiter les commandes. »
Cependant, linverse nest pas vrai; vous ne pouvez pas remplacer arbitrairement les nouvelles lignes avec des points-virgules. Votre script multiligne peut être converti en une seule ligne à condition de respecter les règles de syntaxe ci-dessus et de ne pas insérer de point-virgule supplémentaire après do
:
for i in `seq 1 10`; do echo $i; done
Commentaires
- Le script final est incorrect, comme @ dr01 la souligné, vous devez supprimer le point-virgule après
do
. - @jake, cela indique également que vous devez supprimer le point-virgule après
do
. De plus, cette réponse explique pourquoi vous devez supprimer le point-virgule après `do '. - Et si
$i
doit faire partie dun nom de fichier? A-t-il besoin de guillemets doubles? - faites
filename_${i}
puis - @ user4556274 selon la syntaxe " pour je fais; done " devrait également fonctionner. pourquoi nest-ce pas '?
Réponse
Le point-virgule après do
est une erreur et ne devrait pas être là.
Ce qui suit fonctionne correctement:
for i in `seq 1 10`; do echo $i; done