674

この Bash スクリプトがあり、16 行目に問題がありました。15 行目の前の結果を取得して、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
4

12 に答える 12

33

それを行う方法は千と 1 つあります。dcこれは(無制限の精度演算をサポートする逆ポーランド式卓上計算機)を使用したものです:

dc <<<"$num1 $num2 + p"

しかし、それがあなたにとって(または移植性が問題である)あまりにも無作法である場合は、次のように言うことができます

echo $num1 $num2 + p | dc

しかし、あなたは RPN が気味悪くて奇妙だと思っている人の 1 人かもしれません。心配するな!bcあなたのためにここにあります:

bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc

とは言っても、スクリプトに加えることができるいくつかの無関係な改善があります。

#!/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

Bash FAQ 022で説明されているように、Bash は浮動小数点数をネイティブにサポートしていません。浮動小数点数を合計する必要がある場合は、外部ツール (bcまたは などdc) を使用する必要があります。

この場合、解決策は

num=$(dc <<<"$num $metab + p")

浮動小数点数の累積を に追加しnumます。

于 2011-06-14T20:17:54.117 に答える
25

Bashでは、

 num=5
 x=6
 (( num += x ))
 echo $num   # ==> 11

Bashは整数演算しか処理できないため、AWKコマンドが分数を返す場合は、再設計する必要があります。AWKですべての計算を行うために、コードを少し書き直しました。

num=0
for ((i=1; i<=2; i++)); do
    for j in output-$i-*; do
        echo "$j"
        num=$(
           awk -v n="$num" '
               /EndBuffer/ {sum += $2}
               END {print n + (sum/120)}
           ' "$j"
        )
    done
    echo "$num"
done
于 2011-06-14T22:32:23.320 に答える
24

私はいつも構文を忘れるので、Google 検索に来ますが、使い慣れたものを見つけることができません :P. これは私にとって最もクリーンで、他の言語で私が期待するものにより忠実です。

i=0
((i++))

echo $i;
于 2013-10-28T20:42:18.733 に答える
20

私もこの方法がとても好きです。混乱が少ない:

count=$[count+1]
于 2013-10-25T09:22:55.533 に答える
0
#!/usr/bin/bash

#integer numbers
#===============#

num1=30
num2=5

echo $(( num1 + num2 ))
echo $(( num1-num2 ))
echo $(( num1*num2 ))
echo $(( num1/num2 ))
echo $(( num1%num2 ))

read -p "Enter first number : " a
read -p "Enter second number : " b
# we can store the result
result=$(( a+b ))
echo sum of $a \& $b is $result # \ is used to espace &


#decimal numbers
#bash only support integers so we have to delegate to a tool such as bc
#==============#

num2=3.4
num1=534.3

echo $num1+$num2 | bc
echo $num1-$num2 | bc
echo $num1*$num2 |bc
echo "scale=20;$num1/$num2" | bc
echo $num1%$num2 | bc

# we can store the result
#result=$( ( echo $num1+$num2 ) | bc )
result=$( echo $num1+$num2 | bc )
echo result is $result

##Bonus##
#Calling built in methods of bc 

num=27

echo "scale=2;sqrt($num)" | bc -l # bc provides support for calculating square root

echo "scale=2;$num^3" | bc -l # calculate power
于 2022-01-08T08:59:00.183 に答える