web-dev-qa-db-ja.com

バッシュテスト: "=〜"は何をしますか?

#!/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

先頭の正規表現で先頭の~は何をしますか?

45
ragnarok

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

[[ "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
52
Kusalananda

_[[ 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)).

要するに、_=~_は、_==_および_!=_と同様に演算子です。右側の文字列の実際の正規表現とは関係ありません。

4
Sokel