Bash szorzása és összeadása

for k in {0..49}; do a=$(($((2*$k))+1)); echo $a; done 

Sziasztok, szükségem van egy egyszerűsített kifejezésre a harmadik sorhoz, lehet, hogy egy ne használd a parancs behelyettesítését.

Megjegyzések

  • @Theophrastus: Ahogy azt javasoltam, jól működik, de mi van, ha az (()) helyett az expr szót szeretném használni .
  • Ez bash és nem C, ezért távolítson el minden ; – hacsak nem egyes számokba írja.
  • Lásd még: unix.stackexchange.com/q/40786/117549
  • declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
  • Ezenkívül: $(( ... )) az aritmetikai kiterjesztés, nem pedig a parancs behelyettesítése.

Válasz

Aritmetikai bővítés használata:

for (( k = 0; k < 50; ++k )); do a=$(( 2*k + 1 )) echo "$a" done 

Az elavult expr segédprogram használata:

for (( k = 0; k < 50; ++k )); do a=$( expr 2 "*" "$k" + 1 ) echo "$a" done 

A bc -l ( -l ebben az esetben nem szükséges, mivel nem használunk matematikai függvényeket):

for (( k = 0; k < 50; ++k )); do a=$( bc -l <<<"2*$k + 1" ) echo "$a" done 

A bc -l használata együttes folyamat (egyfajta számítási szolgáltatásként működik a háttérben¹):

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" 

Ez az utolsó (vitathatatlanul) tisztábbnak tűnik a :

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" 

¹ Ez egyszer megoldott egy problémát számomra, ahol nagy mennyiségű bemenetet kellett feldolgoznom a egy hurok. A feldolgozáshoz lebegőpontos számításokra volt szükség, de az ívás bc a ciklusban néhányszor rendkívül lassúnak bizonyult. Igen, sokféle módon megoldhattam volna, de unatkoztam …

Válasz

Leegyszerűsítheti:

a=$(($((2*$k))+1)); 

ide:

a=$((2*k+1)) 

Válasz

A let paranccsal kényszerítheti a számításokat.

let a="2*k+1" 

Vegye figyelembe, hogy ebben a struktúrában nincs szükségünk $k -re; egy egyszerű k elvégzi a munkát.

Megjegyzések

  • Ez nem sikerül, ha ' sa a=2whateverk+1 fájl található az aktuális fájlban Rosszabb, ha van ' sa a=2+b[$(reboot)]k+1 nevű fájl, amely felhívja a reboot parancsot A legjobb, ha itt a ((...)) -t (((a = 2 * k + 1))) vagy a POSIX szintaxist használja: a=$((2 * k + 1))
  • Idézhetjük; let a="2*k+1" ennek megoldására.

Válasz

Valószínűleg a következő számtani bővítésre van szüksége:

a=$(( 1+2*k )) 

Valójában nem kell változót használni:

for k in {0..49}; do echo "$(( 1 + 2*k ))" done 

Vagy a számláló változó áthelyezhető egy for ((…)) hurok:

for (( k=0;k<50;k++ )); do a=$(( 1+2*k )) printf "%s\n" "$a" done 

((…) hurok

És ebben az esetben a számtani bővítés is lehetséges a for ciklus belsejébe költözött:

for (( k=0 ; a=1+2*k , k<50 ; k++)); do printf "%s\n" "$a" done 

Vagy egy tömb összes értékének megszerzéséhez:

for (( k=0 ; a[k]=1+2*k , k<49 ; k++ )); do :; done printf "%s\n" "${a[@]}" 

Nincs képlet

De az aritmetikai kiterjesztés elkerülésének valószínűleg a legrövidebb módja a változó kétszeres növelése:

for (( k=0,a=1 ; k<50 ; k++,a++,a++ )); do printf "%s\n" "$a" done 

Vagy még egyszerűbb, csak használja a következőt:

seq 1 2 100 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük