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.
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.
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.
+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/bashfor i in $(seq 1210)do
echo "skip by 2 value $i"done
Antworten:
Ja, würde ich
(obwohl natürlich
seq 0 2 10
die gleiche Ausgabe für sich alleine erzeugt wird).Beachten Sie,
seq
dass Gleitkommazahlen (z. B.seq .5 .25 3.5
) zulässig sind, die Klammererweiterung von bash jedoch nur Ganzzahlen zulässt.quelle
Die Klammererweiterung von Bash 4 hat eine Schrittfunktion:
Egal ob Bash 2/3 (C-Stil für Schleife, siehe Antworten oben) oder Bash 4, ich würde alles dem Befehl 'seq' vorziehen.
quelle
i
, können Sie dies nicht tunfor {0..10..${i}}
. Es schlägt fehl.Pure Bash, ohne zusätzlichen Prozess:
quelle
quelle
quelle