Bash-Multiplikation und Addition

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 nicht C. 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 Namen a=2+b[$(reboot)]k+1 vorhanden ist, die den Befehl reboot 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 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.