#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
先頭の正規表現で先頭の~
は何をしますか?
~
は、実際には演算子=~
の一部です。これは、左側の文字列と右側の拡張正規表現の正規表現一致を実行します。
[[ "string" =~ pattern ]]
文字列は引用符で囲む必要があり、正規表現は引用符で囲まないでください。
Perlプログラミング言語でも同様の演算子が使用されています。
bash
が理解する正規表現は、GNU grep
が-E
フラグを使用して理解する正規表現、つまり正規表現の拡張セットと同じです。 。
やや話題から外れているが、知っておくと良い:
キャプチャグループを含む正規表現と照合する場合、各グループによってキャプチャされた文字列の一部は、BASH_REMATCH
配列で使用できます。この配列の0番目/最初のエントリは、sed
の置換コマンドの置換パターンの&
(またはPerlの$&
)に対応します。これは、パターンに一致する文字列のビットです、インデックス1以降のエントリは、sed
置換パターン(または\1
、\2
など)の$1
、$2
などに対応します。 Perlの場合)、つまり、各括弧で一致するビット。
例:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
これは出力するかもしれません
Got 09, 19 and 14
現在の時刻がたまたま09:19:14の場合。
BASH_REMATCH
配列名のREMATCH
ビットは、「正規表現一致」、つまり「RE-Match」に由来します。
bash
以外のBourneのようなシェルでは、制限付きの正規表現マッチングのためにexpr
を使用することもできます(基本的な正規表現のみを使用)。
小さな例:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
_[[ expression ]]
_セクションの下のbashのマニュアルページをお読みください。
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
要するに、_=~
_は、_==
_および_!=
_と同様に演算子です。右側の文字列の実際の正規表現とは関係ありません。