Wie erstelle ich einen Bereich mit Schritt n in Bash? (Generieren Sie eine Folge von Zahlen mit Inkrementen)

143

Der Weg, um über einen Bereich in Bash zu iterieren, ist

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

Was wäre die Syntax für das Durchlaufen der Sequenz mit einem Schritt? Angenommen, ich möchte im obigen Beispiel nur eine gerade Zahl erhalten.

SilentGhost
quelle
Gerade Zahlen, multiplizieren Sie i mit 2 .: P
Joey Robert
Multiplikation ist ziemlich hässlich, sollte ich sagen
SilentGhost
2
@ Omnifarious Ich wäre mir nicht so sicher. OS X wird zum Beispiel immer noch mit 3.2 geliefert. Ich würde sagen, dass die C-Schleife akzeptiert werden sollte.
Eli Korvigo

Antworten:

195

Ja, würde ich

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

(obwohl natürlich seq 0 2 10die gleiche Ausgabe für sich alleine erzeugt wird).

Beachten Sie, seqdass Gleitkommazahlen (z. B. seq .5 .25 3.5) zulässig sind, die Klammererweiterung von bash jedoch nur Ganzzahlen zulässt.

Chaos
quelle
4
Ich riskiere eine Vermutung, dass die Abwertung darauf zurückzuführen ist, dass Ihre Antwort generisch auf "sh" und nicht spezifisch auf "bash" lautet. Der reine Bash-Ansatz {begin end step} ist nur geringfügig besser. Die ältere 'seq'-Methode ist praktisch für ältere Systeme oder Systeme mit kleinerem Speicher wie Busybox. Ich habe sowohl Ihre als auch TheBonsais Antwort positiv bewertet. :)
Scott Prive
6
Ziehen Sie $ (...) Backquotes vor. Backquotes nisten nicht vernünftig.
Omnifarious
seq 1000000 1000010 schwebt eigentlich nur - es gibt keine Möglichkeit, ganze Zahlen zu machen! Klammererweiterung funktioniert.
hmijail trauert um den
112

Die Klammererweiterung von Bash 4 hat eine Schrittfunktion:

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

Egal ob Bash 2/3 (C-Stil für Schleife, siehe Antworten oben) oder Bash 4, ich würde alles dem Befehl 'seq' vorziehen.

TheBonsai
quelle
1
und übrigens, wissen Sie, ob bash4 auf einem größeren Betriebssystem Standard ist?
SilentGhost
3
Bash4 ist immer noch kein Mainstream, nein. Warum nicht seq? Sagen wir es mit den Worten des Bots im IRC-Kanal #bash: "seq (1) ist ein sehr ungewöhnlicher externer Befehl, der verwendet wird, um in albernen Linux-Howtos bis 10 zu zählen."
TheBonsai
Mein Verständnis ist, dass seq ein Teil von Coreutils ist. Was ist daran nicht standardisiert? Argumente? danke für Ihre Hilfe.
SilentGhost
4
Diese Argumente können für Sie zählen oder auch nicht: * Es gibt genügend Systeme ohne GNU-Coreutils (aber Bash installiert) * Sie erstellen einen nicht benötigten externen Prozess * Sie verlassen sich auf die Idee, dass alle 'seq' das tun, was Ihre 'seq' tut * es ist nicht standardisiert von der ISO
TheBonsai
3
@becko Wenn der Schritt in der Variablen gespeichert ist i, können Sie dies nicht tun for {0..10..${i}}. Es schlägt fehl.
Nehal J Wani
72

Pure Bash, ohne zusätzlichen Prozess:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done
Fritz G. Mehner
quelle
10
+1 Weil der Schritt auch durch eine Variable ersetzt werden kann.
Nehal J Wani
1
Ich denke, das ist wirklich das, was die meisten Leute wahrscheinlich wollen - eine einfache Möglichkeit, eine Schleife mit einem vorgeschriebenen Schrittwert zu erstellen. Es klingt einfacher als alle auf seq basierenden Antworten und ist eine klarere Syntax als die Bash4-Klammererweiterung und sieht so aus, als würde es Variablen zulassen (das habe ich nicht versucht, aber die Syntax legt dies definitiv nahe).
Tobylaroni
Funktioniert in Bash 3, im Gegensatz zu @ TheBonsais Antwort.
Srcerer
Es wird sogar eine Variable aufgelöst ((i = "$ first"; i <= "$ last"; i + = "$ step")). Nicht so einfach mit geschweiften Klammern und seq.
Blaa_Thor
20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done
z -
quelle
seq ist ein Linux-Befehl. Dies ist unter Mac OS X oder FreeBSD nicht verfügbar.
Dereckson
5
FWIW seq ist in meinem Standard OS X Mavericks 10.9.1
Mark Setchell
Ich habe eine andere Sintax ausprobiert, aber das ist die einzige, die für mich auf einem kleinen CentOS funktioniert. @z - hat meinen Tag gerettet: 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
quelle