79

次のコード

number=1
if [[ $number =~ [0-9] ]]
then
  echo matched
fi

動作します。ただし、正規表現で引用符を使用しようとすると、停止します。

number=1
if [[ $number =~ "[0-9]" ]]
then
  echo matched
fi

私もやってみ"\[0-9\]"ました。私は何が欠けていますか?

おかしなことに、bash の高度なスクリプト作成ガイドでは、これでうまくいくはずだと示唆しています。

バッシュ バージョン 3.2.39。

4

4 に答える 4

121

3.1 と 3.2 の間で変更されました。高度なガイドには更新が必要だと思います。

これは、bash-3.1 のリリース以降に bash-3.2 に追加された新機能の簡潔な説明です。いつものように、マニュアル ページ (doc/bash.1) は完全な説明を探す場所です。

  1. Bash の新機能

をちょきちょきと切る

f. [[ コマンドの =~ 演算子の文字列引数をクォートすると、他のパターン マッチング演算子と同様に、文字列の一致が強制されるようになりました。

悲しいことに、変数にパターンを保存し、正規表現の代わりにそれらを直接使用する洞察がない限り、これはスクリプトを使用した既存の引用を壊します。以下の例。

$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
$ if [[ $number =~ [0-9] ]]; then echo match; fi
match
$ re="[0-9]"
$ if [[ $number =~ $re ]]; then echo MATCH; fi
MATCH

$ bash --version
GNU bash, version 3.00.0(1)-release (i586-suse-linux)
Copyright (C) 2004 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
match
$ if [[ "$number" =~ [0-9] ]]; then echo match; fi
match
于 2008-10-20T12:15:12.737 に答える
22

Bash 3.2 では、互換性オプション compat31 が導入されました。このオプションは、bash の正規表現の引用動作を 3.1 に戻します。

compat31 なし:

$ shopt -u compat31
$ shopt compat31
compat31        off
$ set -x
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ \[0-9] ]]
+ echo no match
no match

compat31 の場合:

$ shopt -s compat31
+ shopt -s compat31
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ [0-9] ]]
+ echo match
match

パッチへのリンク: http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-039

于 2011-06-27T19:00:09.320 に答える