Comment itérer les éléments d'une séquence ?
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:
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:
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:
1 2 3 4
|
for i in {4..8}
do echo $i
done |
on peut avoir plusieurs intervalles (¿séquence discontinue?) :
Code:
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:
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:
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:
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:
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:
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 ?