1. 概要

Python、Perl、Tcl、およびすべてのUNIXシェルスクリプト言語(Bashなど)は、インタープリター言語の例です。 これが、Bashが一度に1つのコマンドを読み取って解釈し、その変数をタイプごとに分離しない理由です。 実際、Bashは型指定されていません。

このチュートリアルでは、さらに深く掘り下げて、変数が事実上数値であるかどうかを確認する方法を見てみましょう。 まず、考えられる多くの解決策を詳しく説明します。 次に、各ソリューションの背後にある考え方を説明します。

2. 変数の比較

Bashはその変数を文字列と見なしますが、変数に対するすべての算術演算と比較を許可します。 基本的な考え方は、変数が数値であるかどうかを評価するには、その値に数字のみが含まれていることを確認する必要があるということです。

2.1. 正規表現の使用

最初の例として、正規表現を使用して指定された入力が整数値であることを確認するintegers.shというスクリプトを作成してみましょう。

#!/bin/bash
echo $1 | grep "^-\?[0-9]+$"

主な成分は次のとおりです。

  • $ 1 には、スクリプト呼び出しに渡されたパラメーターの値が含まれています
  • ここでは、grepコマンドの後に正規表現を定義しています。

より正確には、Unixパイプは、最初のプロセスの標準出力( echo コマンド)を2番目のコマンドの標準入力( grep コマンド)に提供します。 受け入れられる文字は0から9までの数字です。 それに加えて、ダッシュと一緒の記号は、負の数を使用できることを示しています。

正の数の正規表現を定義する場合は、ダッシュ記号のみを削除する必要があります。 それでは、前のスクリプトの呼び出しの2つの例を示しましょう。 整数値を使用すると、次のようになります。

$ ./integers.sh 123 
123

それ以外の場合、文字列を使用すると、次のようになります。

$ ./integers.sh cat

ご覧のとおり、正規表現は整数値を正しく受け入れ、予想どおり、単語を拒否してコンソールに出力しません。

2.2. 等チルダ演算子の使用

この問題を解決する別の方法は、 Equal Tilde (=〜)演算子を使用することです。 これにより、ifステートメントで正規表現を使用できるようになります

#!/bin/bash 
if ! [[ $1 =~ '^[0-9]+$' ]]; 
   then echo "error: Not a number" >&2; exit 1 
fi

ブール条件の右側は、拡張正規表現です。 左側が一致する場合、演算子は0を返し、そうでない場合は1を返します。

これらの最後の命令をext-regexp.shというスクリプトにグループ化して、呼び出してみましょう。

$ ./ext-regexp.sh 1
$ ./ext-regexp.sh a 
error: Not a number

これは、数値を使用する場合、スクリプトがステータス0で正しく終了することを意味します。 それ以外の場合は、エラーを報告し、ステータス1で終了します。

2.3. 実数のマッチング

正規表現の一致ルールを変更するだけで、実数を認識できます。

^[0-9]+([.][0-9]+)?$

記号の付いた実数については、次を使用する必要があります。

^[+-]?[0-9]+([.][0-9]+)?$

3. 結論

このチュートリアルでは、変数がBashの数値であるかどうかを確認する方法を説明しました。 提案されたソリューションはすべて、正規表現の使用に依存しています。