Bu bash betiğine sahibim ve 16. satırda bir sorun yaşadım. Satır 15'in önceki sonucunu nasıl alabilirim ve satır 16'daki değişkene mi?
#!/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
Tamsayılar için:
Aritmetik genişletme]1 kullanın: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # ayrıca çalışır
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # eski, kullanımdan kaldırılmış aritmetik ifade sözdizimi
Harici expr
yardımcı programını kullanma. Bunun yalnızca gerçekten eski sistemler için gerekli olduğunu unutmayın.
num=`expr $num1 + $num2` # expr için boşluk önemlidir
Kayan nokta için:
Bash bunu doğrudan desteklemez, ancak kullanabileceğiniz birkaç harici araç vardır:
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
Bilimsel gösterim de kullanabilirsiniz (örneğin: 2.5e+2
)
Yaygın tuzaklar:
Bir değişken ayarlarken, =
ifadesinin her iki tarafında da boşluk bırakamazsınız, aksi takdirde kabuk ilk kelimeyi çalıştırılacak uygulamanın adı olarak yorumlamaya zorlanır (örn: num=
veya num
)
num=1
num =2
bcve
exprher sayı ve işleci ayrı bir argüman olarak bekler, bu nedenle boşluk önemlidir. 3+
+4
gibi argümanları işleyemezler.
num=`expr $num1+ $num2`
$(( ))` aritmetik açılımını kullanın.
num=$(( $num + $metab ))
Daha fazla bilgi için http://tldp.org/LDP/abs/html/arithexp.html adresine bakınız.
Bunu yapmanın bin bir yolu var. İşte dc
kullanan bir tanesi:
dc <<<"$num1 $num2 + p"
Ancak bu sizin için fazla bash-y ise (veya taşınabilirlik önemliyse) şöyle diyebilirsiniz
echo $num1 $num2 + p | dc
Ama belki de RPN'in iğrenç ve garip olduğunu düşünen insanlardan birisiniz; endişelenmeyin! bc` sizin için burada:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Bununla birlikte, senaryonuzda yapabileceğiniz bazı ilgisiz iyileştirmeler vardır
#!/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
DÜZENLE:
BASH SSS 022](http://mywiki.wooledge.org/BashFAQ/022)'de açıklandığı gibi, bash doğal olarak kayan nokta sayılarını desteklemez. Kayan noktalı sayıları toplamanız gerekiyorsa, harici bir araç (bc
veya dc
gibi) kullanmanız gerekir.
Bu durumda çözüm şu şekilde olacaktır
num=$(dc <<<"$num $metab + p")
Muhtemel kayan noktalı sayıları num
içine toplamak için.