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.


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.


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'.


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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.