Minulla on tämä bash-skripti ja minulla oli ongelma rivillä 16. Miten voin ottaa rivin 15 edellisen tuloksen ja lisätä siihen sen muuttujaan rivillä 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
Kokonaisluvuille:
Käytä aritmeettinen laajennus: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # toimii myös
num=$((num1 + 2 + 3))) # ...
num=$$[num1+num2] # vanha, vanhentunut aritmeettinen lausekesyntaksi.
Ulkoisen expr
-apuohjelman käyttäminen. Huomaa, että tätä tarvitaan vain todella vanhoissa järjestelmissä.
num=`expr $num1 + $num2` # expr:n välilyönti on tärkeää.
Liukulukulaskennassa:
Bash ei suoranaisesti tue tätä, mutta voit käyttää paria ulkoista työkalua:
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
Voit myös käyttää tieteellistä merkintätapaa (esim. 2.5e+2
).
Yleiset sudenkuopat:
Muuttujaa asetettaessa ei saa olla välilyöntejä =
:n molemmin puolin, muuten komentotulkki tulkitsee ensimmäisen sanan suoritettavan sovelluksen nimeksi (esim. num=
tai num
).
num= 1
num =2
bc
ja expr
odottavat jokaista lukua ja operaattoria erillisenä argumenttina, joten välilyönnit ovat tärkeitä. Ne eivät voi käsitellä argumentteja kuten 3+
+4
.
num=`expr $num1+ $num2`
Käytä aritmeettista laajennusta $(( ))
.
num=$(( $num + $metab ))
Katso lisätietoja osoitteesta http://tldp.org/LDP/abs/html/arithexp.html.
Siihen on tuhat ja yksi tapaa. Tässä yksi, jossa käytetään dc
:tä:
dc <<<"$num1 $num2 + p"
Mutta jos se on sinulle liian bash-maista (tai siirrettävyys on tärkeää), voisit sanoa
echo $num1 $num2 + p | dc
Mutta ehkä kuulut niihin ihmisiin, joiden mielestä RPN on ällöttävää ja outoa; älä huoli! bc
on täällä sinua varten:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Siitä huolimatta, on olemassa joitakin parannuksia, joita voisit tehdä skriptiisi...
#!/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:
Kuten BASH FAQ 022 on kuvattu, bash ei tue liukulukuja. Jos haluat laskea yhteen liukulukuja, on käytettävä ulkoista työkalua (kuten bc
tai dc
).
Tässä tapauksessa ratkaisu olisi
num=$(dc <<<"$num $metab + p")
Lisätä kertolaskujen mahdollisesti liukulukuluvuiksi num
:iin.