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″)を実行しようとすると、まだ文字列が表示されているようです。

コメント

  • これは一般的な質問であるため、タイトルを編集しました。コンテキストを絞り込んだ場合、これは何の関係もないことに気付くでしょう。 caseまたは1行以外のもの:echo $num+$num問題を正確に再現するため。最小化するというアイデアプログラミングの質問のコンテキストはここで説明されています: sscce.org
  • +1こんにちはgoldilocks、はい、それは後で私に明らかになりました、しかしはい私は合計yはあなたの論拠に同意します。そうです、より具体的で'単数の'質問の方が良いです。編集を歓迎します:)ありがとうございます:)

回答

POSIXシェルの算術演算は、$と二重括弧(( ))を使用して行われます:

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

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

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

exprもあります:

expr $num1 + $num2 

スクリプトでは$(())は、exprコマンドのフォーク/実行を回避するため推奨されます。

コメント

  • または、caseを使用せずに直接echo $(($num1$op$num2))することもできます。
  • そこに'ここにはcaseは含まれていません。
  • いいえ。ただし、リテラル+を使用したため、

外部で減算を個別に処理します。

  • @manatwork:あなたはmea n echo $(($num1$op$num2))を使用してOP 'のコードからcaseを削除します-これは機能します、ただし、デフォルトの*でエラーを処理できるため、caseの使用はより堅牢です。
  • +1からふたり。私はケースを使用していましたが(最初は表示されていなかった可能性があります)、問題は'ケースに関するものではないことに気づきました。
  • 回答

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

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

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

    コメント

    • bashは' $((...))、多くのシェル(ksh93zshyash少なくとも)そうです。 bcの利点は、任意精度をサポートし、シェル演算はプロセッサに制限されていることです' doubleタイプ。ここで'をscaleに設定する必要はないことに注意してください。追加の場合、scaleパラメーターは使用されません。 3.1415+9.99のスケールは、オペランド(ここでは4)のスケールから導出されます。
    • 1つの値がともう1つは変数$mynumberに格納されている10進数ですか?たとえば、450-$mynumber
    • @sigur echo "450-$mynumber" | bcで実行できます。変数を拡張する場合は、一重引用符ではなく二重引用符を使用する必要があります。
    • @evilsoup、これでチャームのように機能します。ありがとう。
    • computedval=$(echo 'scale=10;var1-var2' | bc)は'機能せず、computedval=$(echo 'scale=10;$var1-$var2' | bc)

    回答

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

    パターンのように扱うことから。

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

    回答

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

    *の前の\(乗算の場合)に注意してください。式全体が逆引用符 `内にある必要があります。

    コメント

    • exprは不要であり、'は必要ありません。コマンドの標準出力をキャプチャして、標準出力に書き戻すために必要です。

    回答

    minimalist

    total=0 ((total+=qty)) 

    回答

    ユーザーに要求する入力の順序に基づく、逆ポーランド記法を使用しているようです。

    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. 

    E 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 $ 

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です