バッシュテスト:「=~」は何をしますか?

バッシュテスト:「=~」は何をしますか?
#!/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

~開始正規表現の先行は何をしますか?

ベストアンサー1

実際には、左側の文字列と右側の拡張正規表現の正規表現一致を実行する~演算子の一部です。=~

[[ "string" =~ pattern ]]

文字列は引用符で囲む必要がありますが、正規表現は引用符で囲むべきではありません(リテラル文字列と一致させる場合を除く)。

Perlプログラミング言語と他の多くの汎用およびドメイン固有の言語では、同様の演算子が正規表現一致を実行するために使用されます。

理解される正規表現は、bashGNUが理解するフラグを持つ正規表現、つまり拡張正規表現のセットと同じです。grep-E


トピックから少し離れていますが、知っておくと良いこと:

キャプチャグループを含む正規表現と一致する場合は、各グループでキャプチャした文字列部分を配列で使用できますBASH_REMATCH。この配列の0番目/最初の項目は、対応するパターンと一致する&文字列のビットである置換命令(またはPerlの)置換パターンに対応し、インデックス1以降の項目は置換パターンの背に対応します。 (またはPerlの場合など)、つまり各括弧が一致するビット。sed$&\1\2sed$1$2

例:

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の場合。

REMATCH配列名のビットはBASH_REMATCH「正規表現一致」、すなわち「RE-Match」から来る。


Bourneに似たシェルではない場合は、制限付き正規表現の一致にもbash使用できますexpr(デフォルトの正規表現のみを使用)。

小さな例:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123

おすすめ記事