2009-06-08 5 views
85

La façon d'effectuer une itération sur une plage dans bash estComment produire gamme avec l'étape n en bash? (Générer une séquence de nombres avec des incréments)

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

Quelle serait la syntaxe de l'itération sur la séquence d'un pas? Dites, je voudrais obtenir seulement le nombre pair dans l'exemple ci-dessus.

+0

Numéros pairs, multiplier i par 2.: P –

+0

multiplication est plutôt moche, je devrais dire – SilentGhost

+0

grande question! –

Répondre

131

Je ferais

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

(même si bien sûr seq 0 2 10 produira la même sortie sur lui-même).

Notez que seq permet des nombres à virgule flottante (par exemple, seq .5 .25 3.5) mais l'expansion de l'accolade de bash permet uniquement des nombres entiers.

+1

Je vais hasarder une supposition que le downvote était dû à votre réponse étant générique de «sh», et non spécifique à «bash». L'approche Bash pure {begin end step} fonctionne un peu mieux. L'ancienne méthode 'seq' est pratique sur les systèmes plus anciens ou plus petits comme busybox. J'ai remis en question votre réponse et celle de TheBonsai. :) –

11
#!/bin/bash 
for i in $(seq 1 2 10) 
do 
    echo "skip by 2 value $i" 
done 
+0

seq est une commande Linux. Cela ne sera pas disponible sur Mac OS X ou FreeBSD. – Dereckson

+3

FWIW seq est disponible dans mon OS X Mavericks standard 10.9.1 –

+0

J'ai essayé un autre sintax, mais c'est le seul qui fonctionne pour mon petit CentOS. @z - a sauvé ma journée: D – erm3nda

44

Bash pur, sans un processus supplémentaire:

for ((COUNTER=0; COUNTER<=10; COUNTER+=2)); do 
    echo $COUNTER 
done 
+6

+1 Parce que l'étape peut aussi être remplacée par une variable. –

70

Bash 4 expansion de croisillon de » a une fonction étape:

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

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

+1

pourriez-vous expliquer pourquoi? – SilentGhost

+0

et btw, savez-vous si bash4 est par défaut sur un OS majeur? – SilentGhost

+2

Bash4 n'est toujours pas mainstream, non. Pourquoi ne pas seq? Eh bien, disons-le avec les mots du bot dans le canal IRC#bash: "seq (1) est une commande externe très non standard utilisée pour compter jusqu'à 10 dans les howtos Linux ridicules." – TheBonsai