Comment produire une gamme avec l'étape n en bash? (générer une séquence de nombres avec des incréments)

143

La façon d'itérer sur une plage dans bash est

for i in {0..10}; do echo $i; done

Quelle serait la syntaxe pour itérer sur la séquence avec une étape? Dites, je voudrais obtenir uniquement un nombre pair dans l'exemple ci-dessus.

SilentGhost
la source
Nombres pairs, multipliez i par 2.: P
Joey Robert
la multiplication est plutôt moche, je devrais dire
SilentGhost
2
@Omnifarious je ne serais pas si sûr. OS X est toujours livré avec 3.2, par exemple. Je dirais que la boucle de style C devrait être acceptée.
Eli Korvigo

Réponses:

195

je ferais

for i in `seq 0 2 10`; do echo $i; done

(bien sûr seq 0 2 10produira le même résultat tout seul).

Notez que seqpermet les nombres à virgule flottante (par exemple, seq .5 .25 3.5) mais l'expansion d'accolades de bash n'autorise que les entiers.

le chaos
la source
4
Je risquerai de supposer que le vote défavorable était dû au fait que votre réponse était générique à «sh», et non spécifique à «bash». L'approche pure Bash {begin end step} fonctionne juste un peu mieux. L'ancienne méthode 'seq' est pratique sur les systèmes de mémoire plus anciens ou plus petits comme busybox. J'ai voté à la fois pour votre réponse et celle de TheBonsai. :)
Scott Prive
6
Préférez $ (...) aux contre-citations. Les contre-citations ne s'imbriquent pas correctement.
Omnifarious
seq 1000000 1000010 ne fait que des flottants, en fait - il n'y a aucun moyen de lui faire faire des entiers! L'expansion des accolades fonctionne.
hmijail pleure les démissionnaires le
112

L'expansion des accolades de Bash 4 a une fonction d'étape:

for {0..10..2}; do
  ..
done

Peu importe si Bash 2/3 (C-style for loop, voir les réponses ci-dessus) ou Bash 4, je préférerais n'importe quoi à la commande 'seq'.

TheBonsai
la source
1
et btw, savez-vous si bash4 est par défaut sur n'importe quel système d'exploitation majeur?
SilentGhost
3
Bash4 n'est toujours pas grand public, non. Pourquoi pas seq? Eh bien, disons-le avec les mots du bot dans le canal IRC #bash: "seq (1) est une commande externe hautement non standard utilisée pour compter jusqu'à 10 dans des howtos Linux idiots."
TheBonsai
je crois comprendre que seq fait partie des coreutils. qu'est-ce qui n'est pas standard à ce sujet? arguments? Merci de votre aide.
SilentGhost
4
Ces arguments peuvent ou non compter pour vous: * il y a suffisamment de systèmes sans GNU coreutils (mais Bash est installé) * vous créez un processus externe inutile * vous vous fiez à l'idée que tous les 'seq' font ce que votre 'seq' fait * c'est non normalisé par l'ISO
TheBonsai
3
@becko Si l'étape est stockée dans la variable i, vous ne pouvez pas le faire for {0..10..${i}}.. elle échoue.
Nehal J Wani
72

Pure Bash, sans processus supplémentaire:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done
Fritz G. Mehner
la source
10
+1 Parce que le pas peut également être remplacé par une variable.
Nehal J Wani
1
Je pense que c'est vraiment ce que la plupart des gens veulent probablement - un moyen simple de faire une boucle avec une valeur de pas prescrite. Cela semble plus simple que toutes les réponses basées sur seq, et c'est une syntaxe plus claire que l'expansion d'accolades Bash4, et on dirait que cela permettrait des variables (je n'ai pas essayé cela, mais la syntaxe le suggère définitivement).
tobylaroni
Fonctionne dans Bash 3, contrairement à la réponse de @ TheBonsai.
srcerer
Il résout même la variable, ((i = "$ first"; i <= "$ last"; i + = "$ step")). Pas si facile avec les accolades et seq.
Blaa_Thor
20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done
z -
la source
seq est une commande Linux. Cela ne sera pas disponible sur Mac OS X ou FreeBSD.
Dereckson
5
FWIW seq est disponible dans mon OS X Mavericks 10.9.1 standard
Mark Setchell
J'ai essayé un autre sintax, mais c'est le seul qui fonctionne pour mon sur un petit CentOS. @z - a sauvé ma journée: D
m3nda
3
> seq 4
1
2
3
4

> seq 2 5
2
3
4
5

> seq 4 2 12
4
6
8
10
12

> seq -w 4 2 12
04
06
08
10
12

> seq -s, 4 2 12
4,6,8,10,12
Mir-Ismaili
la source