Imam to bash skript in sem imel problem v vrstici 16. Kako lahko vzamem prejšnji rezultat vrstice 15 in dodam v spremenljivko v vrstici 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
Za cela števila:
Uporabite aritmetično razširitev: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # deluje tudi
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # stara, zastarela sintaksa aritmetičnega izraza
Uporaba zunanjega pripomočka expr
. Upoštevajte, da je to potrebno le za zelo stare sisteme.
num=``expr $num1 + $num2`` # beli prostor za expr je pomemben
Za plavajočo vejico:
Bash tega neposredno ne podpira, vendar lahko uporabite nekaj zunanjih orodij:
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
Uporabite lahko tudi znanstveni zapis (npr.: 2,5e+2
)
Običajne pasti:
Pri nastavljanju spremenljivke na obeh straneh =
ne smete imeti belih pik, sicer bo lupina prvo besedo interpretirala kot ime aplikacije, ki jo želite zagnati (npr.: num=
ali num
).
num= 1
num =2
bc
in expr
pričakujeta vsako število in operator kot ločen argument, zato so beli presledki pomembni. Argumentov, kot so 3+
+4
, ne moreta obdelati.
num=`expr $num1+ $num2`
Uporabite aritmetično razširitev $(( ))
.
num=$(( $num + $metab ))
Za več informacij glejte http://tldp.org/LDP/abs/html/arithexp.html.
To lahko storite na tisoč in en način. Tukaj je eden z uporabo dc
:
dc <<<"$num1 $num2 + p"
Če pa je to za vas prezahtevno (ali če vam je pomembna prenosljivost), lahko rečete
echo $num1 $num2 + p | dc
Morda pa ste eden tistih, ki mislijo, da je RPN čudaški in čuden; ne skrbite! bc
je tu za vas:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Kljub temu obstaja nekaj nepovezanih izboljšav, ki bi jih lahko vnesli v svojo skripto
#!/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:
Kot je opisano v BASH FAQ 022, bash ne podpira števil s plavajočo vejico. Če želite sešteti števila s plavajočo vejico, morate uporabiti zunanje orodje (kot sta bc
ali dc
).
V tem primeru bi bila rešitev naslednja
num=$(dc <<<"$num $metab + p")
Dodajanje akumulacije števil z možno plavajočo vejico v num
.