次のコマンドで数値と操作を読み取ることができます:
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″)を実行しようとすると、まだ文字列が表示されているようです。
コメント
回答
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
は'$((...))
、多くのシェル(ksh93
、zsh
、yash
少なくとも)そうです。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 $
case
または1行以外のもの:echo $num+$num
。問題を正確に再現するため。最小化するというアイデアプログラミングの質問のコンテキストはここで説明されています: sscce.org