Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

【実例付き】Bash/シェルスクリプトで算術演算を行う方法

数学は簡単、Bashスクリプトの書き方も簡単。ならば、Bashやシェルスクリプトでの算術演算も簡単であるべきです。実際、簡単です。この記事では、その方法を具体例とともにわかりやすく解説します。

整数を扱う

Bashの組み込み算術機能が扱えるのは、整数値のみです。小数などの非整数値を変数として宣言しようとすると:

declare -i e=2.5

次のようなエラーが表示されます。

bash: declare: 2.5: syntax error: invalid arithmetic operator (error token is ".5")

非整数の数値を扱いたい場合は、外部プログラムを使って計算する必要があります。まずは、組み込みのBash算術で整数を扱う方法を見ていきましょう。

変数宣言を使う方法

declare文で変数を整数として宣言しておけば、特別な構文を意識することなく算術演算を実行できます。

# 変数を整数として宣言
declare -i x=4
declare -i y=2

# 整数変数で算術演算
result=x/y

echo $result

この結果は次のようになります。

2

変数が整数として宣言されている場合、式を括弧で囲んで評価する必要はありません。

二重括弧(( ))を使う方法

変数が明示的に整数として宣言されていない場合、スクリプトの引数として渡された場合、あるいはプログラムの出力から取得した場合は、デフォルトで文字列として扱われます。

Bashは文字列に対しても算術演算を行えますが、式を二重括弧で囲み、算術式として明示した場合に限られます。以下の例を見てください。

x=6
((y=$x+3))
echo $y

上記のBashスクリプトの断片は、式の正しい計算結果を出力します。

9

これは、括弧で囲まれた算術式が「数値を持つ変数を含む式」として正しく解釈され、文字列として扱われないためです。

括弧がない場合はどうなるでしょうか。

y=$x+3

出力は次のようになります。

6+3

この場合、式は2つの文字列を連結したものと見なされ、計算は行われません。

サポートされる算術演算子

Bashの組み込み算術では、以下の演算子が使用できます。

演算子 説明
+ 加算
- 減算
++ インクリメント(1増やす)
-- デクリメント(1減らす)
* 乗算
/ 除算
% 剰余(割り算の余り)
** べき乗

ブール演算と算術

ブール演算子を使用する際にも二重括弧が登場します。評価された式は0または1を返すためです。

if (( x > y )); then
    echo "x is greater than y"
fi

Bashのブール演算については、こちらの記事でさらに詳しく解説しています。

小数値を扱う

bcコマンドを使う

冒頭で述べたように、Bashの算術で非整数値を扱おうとするとエラーになります。

bcコマンドは小数値(およびより複雑な計算)を問題なく処理できます。基本の構文は以下の通りです。

bc OPTIONS FILE

各項目の意味は次の通りです。

  • OPTIONS: オプションの一覧(全オプションについてはマニュアルを参照してください)
  • FILE: 解くべき算術式が含まれるテキストファイルへのパス

bcはパイプ経由の入力を受け付けるため、数式をファイルに保存しておく必要はありません。コンソールから直接パイプで渡すことができます。

echo "2.32+3.45" | bc

これにより、正しい答えが出力されます。

5.77

コマンドラインアプリケーションの入出力におけるパイプやリダイレクトの詳しい使い方は、こちらの記事で解説しています。

bcの完全なユーザーマニュアルは、次のコマンドで確認できます。

man bc

bcコマンドには複雑な数学のための高度な構文が多数用意されており、その詳細はユーザーマニュアルに記載されています。

  1. Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル

    Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の

  2. 実用的な5つの例で学ぶBashスクリプト入門チュートリアル

    Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この