Comment faire une boucle for en ligne de commande?

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *