Ik heb dit bash script en ik had een probleem in regel 16. Hoe kan ik het vorige resultaat van regel 15 nemen en toevoegen het aan de variabele in regel 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
Voor gehele getallen:
Gebruik rekenkundige uitbreiding: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # werkt ook
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # oude, verouderde rekenkundige uitdrukking syntaxis
Gebruik de externe expr
utility. Merk op dat dit alleen nodig is voor echt oude systemen.
num=`expr $num1 + $num2` # spatie voor expr is belangrijk
Voor drijvende komma:
Bash ondersteunt dit niet direct, maar er zijn een paar externe tools die je kunt gebruiken:
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
Je kunt ook wetenschappelijke notatie gebruiken (bijv.: 2.5e+2
)
Gemeenschappelijke valkuilen:
Als je een variabele instelt, kun je geen spaties aan weerszijden van =
hebben, anders wordt de shell gedwongen het eerste woord te interpreteren als de naam van de applicatie die moet worden uitgevoerd (bijv: num=
of num
)
num= 1
num =2
bc
en expr
verwachten elk getal en elke operator als een apart argument, dus witruimte is belangrijk. Ze kunnen geen argumenten als 3+
+4
verwerken.
num=`expr $num1+ $num2`
Gebruik de $(( ))
rekenkundige uitbreiding.
num=$(( $num + $metab ))
Zie http://tldp.org/LDP/abs/html/arithexp.html voor meer informatie.
Er zijn duizend-en-één manieren om het te doen. Hier's een met dc
:
dc <<<"$num1 $num2 + p"
Maar als dat te bash-y voor je is (of draagbaarheid van belang is) zou je kunnen zeggen
echo $num1 $num2 + p | dc
Maar misschien ben jij een van die mensen die RPN vies en raar vinden; maak je geen zorgen! bc
is er voor jou:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Dat gezegd hebbende, er zijn een aantal ongerelateerde verbeteringen die je aan je script zou kunnen maken
#!/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:
Zoals beschreven in BASH FAQ 022, ondersteunt bash van nature geen drijvende komma getallen. Als u drijvende komma getallen wilt optellen, is het gebruik van een extern gereedschap (zoals bc
of dc
) vereist.
In dit geval zou de oplossing zijn
num=$(dc <<<"$num $metab + p")
Om de optelling van mogelijk-floating-point getallen in num
.