Linuxシェルでの変数による除算
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
$ 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
$ 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>
ここ、
上記の一般的な形式を使用して変数を分割しましょう。ただし、精度は異なります。
$ 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プログラミング言語を使用して浮動小数点数を除算できることを学びました。