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 dies tut Verwenden Sie keine Befehlssubstitution.
Kommentare
- @Theophrastus: Wie vorgeschlagen funktioniert es gut, aber was ist, wenn ich expr anstelle von (()) verwenden möchte?
- Dies ist
bash
und nichtC
. Entfernen Sie daher alle;
– es sei denn, Sie schreiben es in einer einzelnen Zeile. - Siehe auch: unix.stackexchange.com/q/40786/117549
-
declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
- Nebenbei:
$(( ... ))
ist arithmetische Erweiterung keine Befehlssubstitution.
Antwort
Verwenden der arithmetischen Erweiterung:
for (( k = 0; k < 50; ++k )); do a=$(( 2*k + 1 )) echo "$a" done
Verwenden des veralteten Dienstprogramms expr
:
for (( k = 0; k < 50; ++k )); do a=$( expr 2 "*" "$k" + 1 ) echo "$a" done
Verwenden von bc -l
( -l
wird in diesem Fall nicht benötigt, da keine mathematischen Funktionen verwendet werden):
for (( k = 0; k < 50; ++k )); do a=$( bc -l <<<"2*$k + 1" ) echo "$a" done
Verwenden von bc -l
als Co-Prozess (es wirkt wie eine Art Berechnungsdienst im Hintergrund¹):
coproc bc -l for (( k = 0; k < 50; ++k )); do printf "2*%d + 1\n" "$k" >&${COPROC[1]} read -u "${COPROC[0]}" a echo "$a" done kill "$COPROC_PID"
Dieser letzte sieht in :
bc -l |& bc_pid="$!" for (( k = 0; k < 50; ++k )); do print -p "2*$k + 1" read -p a print "$a" done kill "$bc_pid"
¹ Dies löste ein Problem für mich, bei dem ich eine große Menge an Eingaben verarbeiten musste eine Schleife. Die Verarbeitung erforderte einige Gleitkommaberechnungen, aber das mehrmalige Laichen von bc
in der Schleife erwies sich als außerordentlich langsam. Ja, ich hätte es auf viele andere Arten lösen können, aber mir war langweilig …
Antwort
Sie können vereinfachen:
a=$(($((2*$k))+1));
bis:
a=$((2*k+1))
Antwort
Mit dem Befehl let
können Sie eine Berechnung erzwingen.
let a="2*k+1"
Beachten Sie, dass wir in dieser Struktur $k
nicht benötigen. Eine einfache k
erledigt den Job.
Kommentare
- Dies schlägt fehl, wenn ' eine Datei mit dem Namen
a=2whateverk+1
in der aktuellen Datei vorhanden ist Schlimmer noch, wenn ' eine Datei mit dem Namena=2+b[$(reboot)]k+1
vorhanden ist, die den Befehlreboot
aufruft Am besten verwenden Sie hier((...))
(((a = 2 * k + 1))
) oder die POSIX-Syntax:a=$((2 * k + 1))
- Wir können es zitieren:
let a="2*k+1"
, um das zu lösen.
Antwort
Die arithmetische Erweiterung, die Sie wahrscheinlich benötigen, ist folgende:
a=$(( 1+2*k ))
Tatsächlich müssen Sie keine Variable verwenden:
for k in {0..49}; do echo "$(( 1 + 2*k ))" done
Oder die Zählvariable könnte in eine for ((…))
Schleife:
for (( k=0;k<50;k++ )); do a=$(( 1+2*k )) printf "%s\n" "$a" done
für ((…)) Schleife
In diesem Fall könnte auch die arithmetische Erweiterung sein In die for-Schleife verschoben:
for (( k=0 ; a=1+2*k , k<50 ; k++)); do printf "%s\n" "$a" done
Oder um alle Werte in einem Array abzurufen:
for (( k=0 ; a[k]=1+2*k , k<49 ; k++ )); do :; done printf "%s\n" "${a[@]}"
Keine Formel
Der wahrscheinlich kürzeste Weg, um eine arithmetische Erweiterung zu vermeiden, besteht darin, eine Variable zweimal zu erhöhen:
for (( k=0,a=1 ; k<50 ; k++,a++,a++ )); do printf "%s\n" "$a" done
Oder, noch einfacher, verwenden Sie einfach seq:
seq 1 2 100