Ich möchte eine for-Schleife in Bash mit 0,02 als Inkremente erstellen, die ich versucht habe
for ((i=4.00;i<5.42;i+=0.02))
do
commands
done
aber es hat nicht funktioniert.
bash
for
floating-point
Mehrshad
quelle
quelle
bc
, aber das Stoppen auf 4.52 kann schwierig sein. Verwenden Sie @roaima Vorschlag, haben Sie Hilfs-Var mit Schritt 2, und verwenden Siei=$(echo $tmp_var / 100 | bc)
Antworten:
Das Lesen der
bash
Manpage enthält folgende Informationen:und dann bekommen wir diesen Abschnitt
Es ist also deutlich zu erkennen, dass Sie keine
for
Schleife mit nicht ganzzahligen Werten verwenden können.Eine Lösung kann einfach darin bestehen, alle Ihre Schleifenkomponenten mit 100 zu multiplizieren, um dies dort zu ermöglichen, wo Sie sie später verwenden, wie folgt:
quelle
k=400;k<542;k+=2
da dadurch auch potenzielle Gleitkomma-Rechenprobleme vermieden werden.bc
), einen Prozess verzweigen, eine temporäre Datei (für die Here-Zeichenfolge) erstellen und darin ausführenbc
(was das Laden einer ausführbaren und gemeinsam genutzten Bibliotheken und impliziert) initialisieren), warten und aufräumen.bc
Einmal laufen , um die Schleife zu machen, wäre viel effizienter.i=$(bc <<< "scale...")
oderi=$(echo "scale..." | bc)
<<<
kommt)bash
und schnellerksh
. Beachten Sie, dass Sie durch den Wechsel zu einer anderen Shellbash
eine bessere Leistungssteigerung erzielen als mit der anderen Syntax.<<<
(zsh, mksh, ksh93, yash) auch Gleitkomma - Arithmetik - Unterstützung (zsh
,ksh93
,yash
)).Vermeiden Sie Schleifen in Muscheln.
Wenn Sie rechnen möchten, verwenden Sie
awk
oderbc
:Oder
Beachten Sie, dass
awk
(im Gegensatz zubc
) diedouble
Gleitkommazahlendarstellung Ihres Prozessors funktioniert (wahrscheinlich IEEE 754- Typ). Da diese Zahlen binäre Annäherungen an diese Dezimalzahlen sind, können Sie einige Überraschungen erleben:Wenn Sie ein hinzufügen
OFMT="%.17g"
, können Sie den Grund für das Fehlen sehen0.3
:bc
macht willkürliche Präzision, hat also kein solches Problem.Beachten Sie, dass standardmäßig (sofern Sie das Ausgabeformat nicht mit expliziten Formatspezifikationen ändern
OFMT
oderprintf
mit expliziten Formatspezifikationenawk
verwenden ) die%.6g
Anzeige von Gleitkommazahlen verwendet wird. Wechseln Sie daher für Gleitkommazahlen über 1.000.000 zu 1e6 und höher und kürzen Sie den Bruchteil für hohe Zahlen (100000.02) würde als 100000 angezeigt werden).Wenn Sie wirklich brauchen eine Shell - Schleife zu verwenden, da zum Beispiel mögen Sie bestimmte Befehle für jede Iteration dieser Schleife laufen, entweder eine Shell verwenden , um mit Gleitkomma - Arithmetik - Unterstützung wie
zsh
,yash
oderksh93
oder die Liste der Werte mit einem Befehl zu erzeugen , wie oben (oderseq
falls verfügbar) und durchlaufen den Ausgang.Mögen:
Oder:
Wenn Sie die Grenzen Ihrer Prozessor-Gleitkommazahlen nicht überschreiten, werden
seq
Fehler, die durch Gleitkomma-Approximationen auftreten, eleganter behandelt als dieawk
obigen Version.Wenn Sie keinen
seq
(GNU-Befehl) haben, können Sie einen zuverlässigeren Befehl als Funktion wie folgt erstellen:Das würde besser funktionieren für Dinge wie
seq 100000000001 0.000000001 100000000001.000000005
. Beachten Sie jedoch, dass Zahlen mit willkürlich hoher Genauigkeit nicht viel helfen, wenn wir sie an Befehle übergeben, die sie nicht unterstützen.quelle
unset IFS
im ersten Beispiel?IFS=$'\n'
aber das funktioniert nicht in allen Muscheln. OderIFS='<a-litteral-newline-here>'
aber das ist nicht sehr gut lesbar. Oder wir können stattdessen Wörter aufteilen (Leerzeichen, Tabulator, Zeilenumbruch), wie Sie sie mit dem Standardwert $ IFS erhalten, oder wenn Sie IFS deaktivieren und auch hier arbeiten.IFS
, da wir wissen, dassseq
die Ausgabe keine Leerzeichen enthält, auf die wir uns nicht aufteilen müssen. Es ist meistens da, um sicherzustellen, dass Sie erkennen, dass dieses Beispiel davon abhängtIFS
, was für einen anderen Befehl zum Generieren von Listen von Bedeutung sein kann.Verwenden Sie "seq" - drucken Sie eine Folge von Zahlen
seq ERSTE ERHÖHUNG LETZT
quelle
Wie andere vorgeschlagen haben, können Sie bc verwenden:
quelle