for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Hallo, ich brauche einen vereinfachten Ausdruck für die dritte Zeile, vielleicht einen, der keine Befehlsersetzung verwendet.
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Hallo, ich brauche einen vereinfachten Ausdruck für die dritte Zeile, vielleicht einen, der keine Befehlsersetzung verwendet.
bash
und nichtC
, also entfernen Sie alle;
- es sei denn, Sie schreiben es in einer einzelnen Zeile.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
arithmetische Erweiterung keine Befehlssubstitution?Antworten:
Verwenden der arithmetischen Erweiterung:
Verwenden des antiquierten
expr
Dienstprogramms:Using
bc -l
(wird-l
in diesem Fall nicht benötigt, da keine mathematischen Funktionen verwendet werden):Verwendung
bc -l
als Co-Prozess (wirkt wie eine Art Rechendienst im Hintergrund¹):Das letzte sieht (wohl) sauberer aus in
ksh93
:¹ Dies löste ein Problem für mich, bei dem ich eine große Menge an Eingaben in einer Schleife verarbeiten musste. Die Verarbeitung erforderte einige Gleitkommaberechnungen, aber
bc
einige Male in der Schleife zu spawnen, erwies sich als außerordentlich langsam. Ja, ich hätte es auf viele andere Arten lösen können, aber mir war langweilig ...quelle
Sie können vereinfachen:
zu:
quelle
Mit dem
let
Befehl können Sie eine Berechnung erzwingen.Beachten Sie, dass wir
$k
in dieser Struktur nicht brauchen ; Ein einfacherk
wird die Arbeit erledigen.quelle
a=2whateverk+1
im aktuellen Verzeichnis eine Datei aufgerufen wird . Schlimmer noch, wenn eine Datei aufgerufena=2+b[$(reboot)]k+1
wird, die denreboot
Befehl aufruft . Am besten ist es zu verwenden ,((...))
hier (((a = 2 * k + 1))
) oder die POSIX - Syntax:a=$((2 * k + 1))
let a="2*k+1"
um das zu lösen.Die arithmetische Erweiterung, die Sie wahrscheinlich benötigen, ist folgende:
Tatsächlich müssen Sie keine Variable verwenden:
Oder die Zählvariable könnte in eine
for ((…))
Schleife verschoben werden :für ((…)) Schleife
In diesem Fall könnte die arithmetische Erweiterung auch in die for-Schleife verschoben werden:
Oder, um alle Werte in einem Array abzurufen:
Keine Formel
Der wahrscheinlich kürzeste Weg, um eine arithmetische Erweiterung zu vermeiden, besteht darin, eine Variable zweimal zu erhöhen:
Oder, noch einfacher, benutze einfach seq:
quelle