Question : Comment itérer les éléments d'une séquence ?

bof bof... le titre n'est peut-être pas assez évocateur.

Réponse:
On pourrait obtenir le même résultat, que celui que présentent les exemples qui suivent, de cette façon :
à ce simple cas, on peut opposé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
printf '%d\n' {4..8}
# cf. man bash /Développement des accolades
Au sein d'une boucle for, on va pouvoir itérer sur chacune des valeurs de cette séquence.
Assigner chacune, lors de chaque boucle, à une même variable, qui sera écrasée par la valeur suivante lors de la prochaine boucle.
Cette variable est alors disponible pour toutes les commandes à l'intérieur de la boucle `for`.

Vous pourriez aussi bien faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
for i in 4 5 6 7 8
do echo $i
done
mais, parfois, la séquence peut être très longue, ou alors, on peut ne pas connaître à l'avance les bornes de la séquence.

avec des "constantes" numériques (on connaît les bornes inférieures et supérieures de la séquence) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
for i in {4..8}
do echo $i
done
on peut avoir plusieurs intervalles (¿séquence discontinue?) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
for i in {4..8} {11..14}
do echo $i
done
avec bash4, il est possible de définir le pas (c'est-à-dire, la différence entre deux nombres de la séquence) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
for i in {4..14..3}
do echo $i
done
mais, ça se complique si on veut utiliser des variables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
var=$1 #premier paramètre positionnel que l'on a préalablement testé, et dont on certain que c'est un nombre.
debut=$((var+2))
fin=$((debut+4))
il faudrait utiliser `eval` :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
for i in $(eval echo {$debut..$fin})
do echo $i
done
il est alors possible d'utiliser une boucle for dans le style C (C-style for loop) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
for (( i=debut ; i < fin ; i++ ))
do echo $i
done
de la même manière que précédemment (sans bash4 installé), il est possible de régler le pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
fin=14
for (( i=debut ; i < fin ; i+=3 ))
do echo $i
done
vous remarquerez, que je n'ai pas ajouter de signe dollar devant les bornes de l'intervalle (ce n'est pas une coquille),
au sein des évaluations arithmétiques (entre `((` et `))`), le $ n'est pas nécessaire.


Par contre, cette dernière forme ne peut rien pour des variables alphabétiques :
il faut en repasser par `eval` (cf. supra)

Si vous n'utilisez pas GNU/Linux, ou si votre shell n'accepte pas ces commandes,
il vous faudra vous assurer que vous disposez d'un programme qui générera la séquence de nombres, ou de lettres, souhaitée.
Soit, une de ces commandes :
- seq : disponible dans GNU coreutils (seq2 sur BSD)
- gseq
- jot
voyez : Comment faire une boucle sur une indice ?