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

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 を実行しようとすると、まだ文字列が取得されるようです ("4" ではなく "2+2")。

答え1

POSIX シェルでの算術演算$二重括弧で行われます(( )):

echo "$(($num1+$num2))"

そこから代入することができます。また、$内部の変数名の演算子は(())オプションであることに注意してください。

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

もありますexpr

expr $num1 + $num2

$(())コマンドのフォーク/実行を回避するため、スクリプトを使用することをお勧めしますexpr

答え2

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

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

は、小数点以下 4 桁を使用するようscale=4指示します。詳細については、を参照してください。bcman bc

答え3

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

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

答え4

ミニマリスト

total=0
((total+=qty))

関連情報