1. ホーム
  2. regex

bash regex with quotes?

2023-09-26 05:52:13

質問

次のコード

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

は動作します。しかし、正規表現で引用符を使おうとすると、止まってしまいます。

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

試しに "\[0-9\]" も試しました。何が足りないのでしょうか?

面白いことに bash アドバンスドスクリプティングガイド はこれがうまくいくことを示唆しています。

Bash バージョン 3.2.39.

どのように解決するのですか?

変更されたのは は、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