1. 概要

Bash には、除算を実行するためのコマンドとユーティリティがいくつかあります。 それらに加えて、Linuxディストリビューションで利用可能なスクリプト言語を使用することもできます。

このチュートリアルでは、Bashでの除算に関する次のオプションについて説明します。

  • expr let、、およびprintfコマンド
  • 二重括弧複合コマンド
  • bcおよびawkユーティリティ
  • PythonおよびPerlプログラミング言語

これらすべてのオプションで、除算演算子、つまり/を使用します。

2. exprコマンドの使用

除算に使用できるコマンドの1つは、exprコマンドです。

$ x=60
$ y=-3
$ expr $x / $y
-20

結果が実際には浮動小数点数である必要がある場合でも、整数を返します。

$ x=60
$ y=-9
$ expr $x / $y
-6

ここでは、結果は約-6.67になると予想されますが、小数点と小数点以下の桁は切り捨てられています。 これは、Bashが浮動小数点演算をサポートしていないためです。

さらに、 expr コマンドは、次のいずれかの入力として浮動小数点数を受け取ることはできません。

$ x=60.0
$ y=-3
$ expr $x / $y
expr: non-integer argument

除算演算子の前後のスペースが重要です

$ x=60
$ y=-3
$ expr $x/$y
60/-3

ご覧のとおり、除算演算子の前後にスペースがない場合、exprコマンドに指定された式は文字列として評価されます。 除算演算子の前後のスペースを省略すると、構文エラーが発生します。

$ expr $x /$y  # No space after /
expr: syntax error: unexpected argument '/-3'
$ expr $x/ $y  # No space before /
expr: syntax error: unexpected argument '-3'

3. letコマンドの使用

除算にはletコマンドを使用することもできます。 1つ以上の算術演算を取り、それらを評価します。

letコマンドで除算してみましょう。

$ let x=60 y=-9 result=x/y
$ echo $result
-6

let コマンドのコンテキスト内で定義されていないシェル変数を使用して、同じ除算を行うことができます。

$ x=60
$ y=-9
$ let result=$x/$y
$ echo $result
-6

exprコマンドと同様に、除算の結果は整数になります。 また、分子と分母は整数である必要があり、浮動小数点数にすることはできません。

$ x=10.5
$ y=-2
$ let result=$x/$y
-bash: let: result=10.5/-2: syntax error: invalid arithmetic operator (error token is ".5/-2")

4. 二重括弧複合コマンドの使用

除算を実行する別の方法は、二重括弧の複合コマンド $((…))を使用することです。

$ x=60
$ y=-9
$ echo $(($x / $y))
-6

expr コマンドの除算演算子の前後のスペースの存在に関する制限は、二重括弧の複合コマンドでは無効です。

$ x=60
$ y=-9
$ echo $(($x/$y))  # No spaces before and after /
-6

結果は、exprおよびletコマンドの出力のような整数であることがわかります。 したがって、分子と分母も整数である必要があり、浮動小数点数にすることはできません。

$ x=10.5
$ y=-2
$ echo $(($x/$y))
-bash: 10.5/-2: syntax error: invalid arithmetic operator (error token is ".5/-2")

5. printfコマンドの使用

除算に使用できるもう1つのコマンドは、printfコマンドです。 このコマンドは、Cプログラミング言語の対応するコマンドに似ています。

入力としてフォーマット指定と引数を取り、出力としてフォーマットされたテキストを出力します。

$ x=60
$ y=-9
$ printf "%f\n" $((x/y))
-6.000000

“ %f \ n” は、端末に印刷されるフォーマットされたテキストです。 ここで、%fはフォーマット指定子です。 対応する引数が浮動小数点数であることを出力します。 \nは新しい行を作成するためのものです。 最後に、 $((x / y))は、フォーマット指定子に提供される引数です。

すでに知っているように、演算 $((x / y))の結果は-6であるため、最後の除算の結果の小数部分は正しくありません。 %f 形式指定子は、この整数を浮動小数点数としてのみ出力したため、-6.000000を取得しました。 ただし、より正確な結果を取得することは可能です。

$ printf "%f\n" $((10**6 * x/y))e-6
-6.666666

この結果がどのようにして得られたかを説明しましょう。 $((10 ** 6 * x / y))e-6 であるフォーマット指定子の後の引数は、左から右に評価されました。 最初に、引数の $((10 ** 6 * x / y))部分が評価されました。 ここでは、最初に 10 ** 6 (1000000)にxを掛けました。 したがって、60000000を取得しました。 次に、それを y で除算したので、整数除算により-6666666になりました。 この時点で、フォーマット指定子に渡される引数として-6666666e-6がありました。 e-6 のため、フォーマット指定子はこの数値を浮動小数点数として処理し、-6666666を1000000で除算して、-6.666666を取得しました。

したがって、 printf コマンドでより正確な結果を得る秘訣は、この一般的な形式で使用することです。

$ printf "%.<precision>f\n" $((10**<precision> * <numerator>/<denominator>))e-<precision>

ここ、

小数点以下の桁数です。 で割った数です 。 もしもフォーマット指定子では指定されません。デフォルトでは6です。

上記の一般的な形式を使用して変数を分割しましょう。ただし、精度は異なります。

$ printf "%.4f\n" $((10**4 * x/y))e-4
-6.6666

精度として4を指定したため、-6.6666を出力しました。 デフォルトの精度は6です。

分子と分母は整数である必要があり、浮動小数点数にすることはできません

$ x=10.5
$ y=-2
$ printf "%f\n" $((x/y))
-bash: 10.5: syntax error: invalid arithmetic operator (error token is ".5")

6. bcコマンドの使用

bc ユーティリティは、除算の実行にも役立ちます。 bcはBasicCalculatorの略です。 パラメータを指定せずにユーティリティを実行すると、インタラクティブモードで実行されます。 このモードでは、除算式を入力して結果を取得できます。

$ bc -q
60/-9
-6

bcコマンドに渡された-qオプションは、インタラクティブモードの開始時に出力されるウェルカムメッセージを抑制するだけです。

インタラクティブモードではシェル変数を使用できません。 ただし、シェルパイプ( | )を使用して、非対話型モードでそれらを使用できます。

$ x=60
$ y=-9
$ echo "$x / $y" | bc
-6

ここで、シェルパイプオペレータは、echoコマンドの出力をbcコマンドの標準入力にフィードします。

bcコマンドに固有の特別な変数scaleを使用すると、浮動小数点数として結果を取得できます。 その値はデフォルトで0です。 そのため、上記のコマンド実行の出力には小数点がありませんでした。 スケールは、小数点以下の桁数を決定します。 4 に設定すると、小数点以下4桁になります。

$ echo "scale=4; $x / $y" | bc
-6.6667

分子と分母は浮動小数点数にすることもできます

$ x=10.5
$ y=-2
$ echo "scale=4; $x / $y" | bc
-5.2500

上記のコマンドで二重引用符を使用することは重要です。 二重引用符を使用すると、シェルでシェル変数を展開できます。 ただし、代わりに一重引用符を使用すると、構文エラーが発生します。 一重引用符でシェルがシェル変数を展開することはできません

$ x=60
$ y=-9
$ echo '$x / $y' | bc
(standard_in)  1: illegal character: $
(standard_in)  1: illegal character: $

7. awkコマンドの使用

awk コマンドは、よく知られているテキスト処理ユーティリティです。 また、算術演算の実行もサポートしています。

このサポートをBEGINルールと一緒に使用して、除算を実行できます。 awk コマンドは、入力を処理する前にBEGINルールを1回使用します。 それでは、awkコマンドを使用して除算を実行しましょう。

$ awk 'BEGIN {x=60;y=-9;print x/y}'
-6.66667

出力からわかるように、除算の結果は浮動小数点数です。 ここでは、BEGINルールのアクション部分内で変数xおよびyを定義しました。 シェルですでに定義されている変数を使用することもできますが、二重括弧を使用する必要があります。

$ x=60
$ y=-9
$ awk "BEGIN {print $x/$y}"
-6.66667

変数は浮動小数点数にすることもできます

$ x=10.5
$ y=-2
$ awk "BEGIN {print $x/$y}"
-5.25

8. Pythonプログラミング言語の使用

Python プログラミング言語は通常、Linuxディストリビューションにインストールされています。 Pythonスクリプトを記述せずに、コマンドラインからPythonステートメントを実行できます。

システムにPython2とPython3の両方がインストールされているとすると、pythonコマンドはpython2またはpython3コマンドへのソフトリンクになります。 両方のPythonバージョンで分割を行いましょう。

$ x=60
$ y=-9
$ python3 -c "print($x/$y)"
-6.666666666666667
$ python2 -c "print($x/$y)"
-6

python2およびpython3コマンドに渡される–c オプションを使用すると、コマンドラインからPythonステートメントを実行できます。

Python2で2つの整数を除算すると整数になりますが、Python3では浮動小数点数になる可能性があります。

Python3で結果の精度を設定することが可能です。

$ python3 -c 'x=60; y=-9; print("{:.4f}".format(x/y))'
-6.6667

Pythonにはfloatデータ型があるため、除算の入力は浮動小数点数にすることができます

$ python3 -c 'x=10.5; y=-2.0; print("{:.2f}".format(x/y))'
-5.25

9. Perlプログラミング言語の使用

Perl は、ほとんどのLinuxディストリビューションでもすぐに利用できます。 したがって、除算にも使用できます。

$ x=60
$ y=-9
$ result=$(perl -e "print $x/$y")
$ echo $result
-6.666666666666667

perlコマンドに渡された–e オプションを使用すると、コマンドラインからPerlステートメントを実行できます。 結果の精度を設定できます。

$ perl -e '$x=60; $y=-9; printf("%.4f\n", $x/$y)'
-6.6667

Perlは浮動小数点数をサポートしているため、浮動小数点数を除算できます

$ x=10.5
$ y= -2
$ result=$(perl -e "print $x/$y")
$ echo $result
-5.25

10. 結論

この記事では、Bashで除算を実行するいくつかの方法について説明しました。

expr let、、および二重括弧の複合コマンドでは整数除算のみが可能であり、結果も整数であることがわかりました。 対照的に、 printf コマンドでも整数除算のみが許可されますが、結果は浮動小数点数になる可能性があります。

最後に、bcおよびawkユーティリティと、PythonおよびPerlプログラミング言語を使用して浮動小数点数を除算できることを学びました。