どうすればbashで2つの数字を追加(減算など)できますか?


90

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

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")を追加しようとすると、おそらく文字列を取得しているようです。


5
これは良い一般的な質問です、そしてあなたは、コンテキストを絞り込む場合は、これはとは何の関係もありません実現していますので、私はあなたのタイトルを編集したcase:1行を除いか何かをecho $num+$num、それがあるため、正確に問題を再現します。プログラミングの質問でコンテキストを最小化するアイデアをここで説明します:sscce.org
goldilocks

2
こんにちはgoldilocks、はい、それは後で私に明らかになりましたが、はい、私はあなたの推論のラインに完全に同意します。編集を歓迎します:)ありがとう:)
マイケルデュラント

回答:


117

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

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

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

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

またありますexpr

expr $num1 + $num2

スクリプトの場合$(())は、exprコマンドのfork / executeが回避されるため望ましいです。


またはを使用echo $(($num1$op$num2))せずに直接case
マナトワーク

caseここには関係ありません。
goldilocks

1
いいえ、ただしリテラルを使用した+ためcase、減算を個別に処理するには外部が必要です。
マナトワーク

1
@manatwork:caseOPのコードからを削除することを意味しますecho $(($num1$op$num2))-これは動作しcaseますが、デフォルトを使用してエラーを処理できるため、を使用するとより堅牢になります*
goldilocks

両方に+1。私はケースを使用していました(最初はそれを示していなかったかもしれません)が、両方の問題がケースに関するものではないことに気づきました。
マイケルデュラント

13

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

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

scale=4告げるbc4小数点以下を使用します。詳細についてはman bc、を参照してください。


その中には、注意bashして浮動小数点演算をサポートしていない$((...))、多くのシェル(ksh93zshyash少なくとも)を行います。利点bcは、任意の精度をサポートする一方で、シェルの計算はプロセッサのdoubleタイプに制限されることです。ここで設定scaleする必要はないことに注意してください。追加の場合、scaleパラメーターは使用されません。のスケールは3.1415+9.99、オペランドのスケールから導出されます(ここでは4)。
ステファンシャゼル16

1つの値であればどのように数学を行うには450、その他は小数点変数に保存されていますか$mynumber?たとえば、450-$mynumber
シグル

@sigur echo "450-$mynumber" | bcはそれを行う必要があります。変数を展開する場合は、一重引用符ではなく二重引用符を使用する必要があります。
evilsoup

@evilsoup、今では魅力のように機能します。ありがとう。
シグル

computedval=$(echo 'scale=10;var1-var2' | bc)動作しない、または動作しないcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
StatsSorceress

5
echo `expr $a + $b`   
echo `expr $a - $b`   
echo `expr $a \* $b`   
echo `expr $a / $b`   

(乗算のため)の\前に注意してください、*式全体がバッククォート `内になければなりません。


1
exprは必要ありません。コマンドを標準出力に書き戻すためだけに、コマンドの標準出力をキャプチャする必要はありません。
chepner


1

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

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

0

ユーザーから要求する入力シーケンスに基づいて、逆ポーランド記法を使用しているようです

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
$
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.