私は数字と操作を読むことができます:
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
コマンドのfork/executeを回避するため、$(())
が推奨されます。
既存の答えは純粋なbashなので、これよりも高速ですが、整数しか処理できません。 floatを処理する必要がある場合は、外部プログラムbc
を使用する必要があります。
$ echo 'scale=4;3.1415+9.99' | bc
13.1315
scale=4
は、小数点以下4桁を使用するようにbc
に指示します。見る man bc
詳細については。
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a / $b`
\
の前に *
(乗算の場合)、式全体がバッククォート `内にある必要があります。
$[ ... ]
構造を使用することもできます。この場合、Bashの組み込みメカニズムを使用します。これは、より高速で、使用が少し便利です。 $ [と]の間のすべてが式として扱われることがわかっているため、変数の前に$
を付ける必要はありません。同様に、*
をパターンのように扱うことから保護する必要はありません。
num1=2
num2=3
echo $[num1 + num2]
5
ミニマリスト
total=0
((total+=qty))
ユーザーからリクエストした一連の入力に基づいて、あなたは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
$