web-dev-qa-db-fra.com

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 oblige Shell à exécuter la commande en cours de manière synchrone, puis passe à 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 Shell ne peut pas interpréter la ligne suivante

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

comment cela for loop fonctionne réellement?

26
user30167

La syntaxe d'une boucle for à partir de la page de manuel bash est

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

Les points-virgules peuvent être remplacés par des retours chariot, comme indiqué ailleurs dans la page de manuel bash: "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 le do:

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

Le point-virgule après do est une erreur et ne devrait pas y être.

Les éléments suivants fonctionnent correctement:

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