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
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 ' saa=2+b[$(reboot)]k+1
nevű fájl, amely felhívja areboot
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
bash
és nemC
, ezért távolítson el minden;
– hacsak nem egyes számokba írja.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
az aritmetikai kiterjesztés, nem pedig a parancs behelyettesítése.