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 seq 4 8
Au sein d'une boucle for, on va pouvoir itérer sur chacune des valeurs de cette séquence.
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
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 :
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.
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
avec des "constantes" numériques (on connaît les bornes inférieures et supérieures de la séquence) :
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} 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..8} {11..14} 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 for i in {4..14..3} do echo $i done
il faudrait utiliser `eval` :
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 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 in $(eval echo {$debut..$fin}) 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 for (( i=debut ; i < fin ; i++ )) 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),
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
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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 debut=d fin=f
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 ?
Partager