Comment faire une boucle for en ligne de commande?

22

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 d'exé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 qu'il ne vous permet pas d'entrer la commande suivante, vidant immédiatement le tampon.

Alors pourquoi le shell ne peut pas interpréter la ligne suivante

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

comment cela fonctionne-t-il for loopréellement?

user30167
la source

Réponses:

16

La syntaxe d'une forboucle de la bashpage 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 la bashpage de manuel: "Une séquence d'un ou plusieurs sauts de ligne peut apparaître dans une liste au lieu d'un point-virgule pour délimiter les commandes."

Cependant, l'inverse n'est pas vrai; vous ne pouvez pas remplacer arbitrairement les retours à la ligne par des points-virgules. Votre script multiligne peut être converti en une seule ligne tant que vous respectez les règles de syntaxe ci-dessus et n'insérez pas de point-virgule supplémentaire après do:

for i in `seq 1 10`; do echo $i; done
user4556274
la source
2
Le script final est incorrect, comme l'a souligné @ dr01, vous devez supprimer le point-virgule après do.
Jake
1
@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 «faire».
user4556274
Que faire si $idoit faire partie d'un nom de fichier? A-t-il besoin de guillemets doubles?
Anonyme
18

Le point-virgule après doest une erreur et ne devrait pas être là.

Les éléments suivants fonctionnent correctement:

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