Mám tento bash skript a mal som problém v riadku 16. Ako môžem vziať predchádzajúci výsledok z riadku 15 a pridať do premennej v riadku 16?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Pre celé čísla:
Použite aritmetický rozklad: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # tiež funguje
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # stará, zastaraná syntax aritmetických výrazov
Použitie externého nástroja expr
. Všimnite si, že je to potrebné len pre naozaj staré systémy.
num=`expr $num1 + $num2` # biele znaky pre expr sú dôležité
Pre pohyblivú desatinnú čiarku:
Bash to priamo nepodporuje, ale existuje niekoľko externých nástrojov, ktoré môžete použiť:
num=$(awk "BEGIN {print $num1+$num2; exit}")
num=$(python -c "print $num1+$num2")
num=$(perl -e "print $num1+$num2")
num=$(echo $num1 + $num2 | bc) # whitespace for echo is important
Môžete tiež použiť vedecký zápis (napr.: 2,5e+2
)
Obvyklé nástrahy:
Pri nastavovaní premennej nesmiete mať na oboch stranách =
biele znaky, inak to prinúti shell interpretovať prvé slovo ako názov spúšťanej aplikácie (napr.: num=
alebo num
)
num= 1
num =2
bc
a expr
očakávajú každé číslo a operátor ako samostatný argument, preto sú dôležité biele znaky. Nedokážu spracovať argumenty ako 3+
+4
.
num=`expr $num1+ $num2`
Použite aritmetický rozklad $(( ))
.
num=$(( $num + $metab ))
Viac informácií nájdete na http://tldp.org/LDP/abs/html/arithexp.html.
Existuje tisíc a jeden spôsob, ako to urobiť. Tu je jeden s použitím dc
:
dc <<<"$num1 $num2 + p"
Ale ak je to pre vás príliš bash-y (alebo vám záleží na prenosnosti), môžete povedať
echo $num1 $num2 + p | dc
Ale možno'ste jedným z tých ľudí, ktorí si myslia, že RPN je smiešny a divný; nebojte sa! bc
je tu pre vás:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Napriek tomu existuje niekoľko nesúvisiacich vylepšení, ktoré by ste mohli urobiť vo svojom skripte
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in output-$i-* ; do # for can glob directly, no need to ls
echo "$j"
# grep can read files, no need to use cat
metab=$(grep EndBuffer "$j" | awk '{sum+=$2} END { print sum/120}')
num=$(( $num + $metab ))
done
echo "$num"
done
EDIT:
Ako je popísané v BASH FAQ 022, bash nepodporuje čísla s plávajúcou desatinnou čiarkou. Ak potrebujete sčítať čísla s pohyblivou desatinnou čiarkou, je potrebné použiť externý nástroj (napríklad bc
alebo dc
).
V tomto prípade by riešenie bolo nasledovné
num=$(dc <<<"$num $metab + p")
Ak chcete pridať kumulatívne čísla s možnou pohyblivou rádovou čiarkou do num
.