web-dev-qa-db-ja.com

bashで2つの数値を加算(減算など)するにはどうすればよいですか?

私は数字と操作を読むことができます:

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

しかし、その後、番号を追加する私のすべての試みは失敗します:

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo `num1-num2`;;
esac

実行:

First number please
1
Second mumber please
2
Operation?
+

出力:

num1+num2

...または...

echo $num1+$num2;;

# results in: 1+2    

...または...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found

おそらくadd add( "4"ではなく "2 + 2")しても文字列がまだ取得されているようです。

106
Michael Durrant

POSIXシェルの算術 は_$_と二重括弧_(( ))_で行われます。

_echo "$(($num1+$num2))"
_

それから割り当てることができます(sans echo):

_num1="$(($num1+$num2))"
_

exprもあります:

_expr $num1 + $num2
_

スクリプトでは、exprコマンドのfork/executeを回避するため、$(())が推奨されます。

148
goldilocks

既存の答えは純粋なbashなので、これよりも高速ですが、整数しか処理できません。 floatを処理する必要がある場合は、外部プログラムbcを使用する必要があります。

$ echo 'scale=4;3.1415+9.99' | bc
13.1315

scale=4は、小数点以下4桁を使用するようにbcに指示します。見る man bc 詳細については。

15
evilsoup
echo `expr $a + $b`   
echo `expr $a - $b`   
echo `expr $a \* $b`   
echo `expr $a / $b`   

\ の前に *(乗算の場合)、式全体がバッククォート `内にある必要があります。

5
Himani

$[ ... ]構造を使用することもできます。この場合、Bashの組み込みメカニズムを使用します。これは、より高速で、使用が少し便利です。 $ [と]の間のすべてが式として扱われることがわかっているため、変数の前に$を付ける必要はありません。同様に、*をパターンのように扱うことから保護する必要はありません。

num1=2
num2=3
echo $[num1 + num2]
5
3
jedi

ミニマリスト

total=0
((total+=qty))
2
geekzspot

ユーザーからリクエストした一連の入力に基づいて、あなたはreverse polish notation。を使用しているようです

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

dc(卓上計算機)を直接使用する方がよい場合があります。

DESCRIPTION
       Dc is a reverse-polish desk calculator which supports unlimited pre-
       cision arithmetic.

dcを使用したセッションの例:

$ dc
1 2 + p    # This part is typed; the result comes next.
3
q  # This is also typed.
$

または、非インタラクティブに:

$ dc -e '1 2 + p'
3
$
0
Wildcard