web-dev-qa-db-ja.com

bashのif句内での正規表現の使用

Ifブロックを見てください:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

これは「一致した」と出力するはずですが、そうではありません。どこがいけないの?

10
Majid Azimi

正規表現の一致で引用符を削除する必要があります。

if [[ ${str} =~ m\.m ]]; then

Bashのmanページから:

[...]追加の2項演算子=〜が利用可能で、==および!=と同じ優先順位があります。これを使用すると、演算子の右側の文字列は拡張正規表現と見なされ、それに応じて一致します(regex(3)のように)。文字列がパターンに一致する場合、戻り値は0で、そうでない場合は1です。正規表現が構文的に正しくない場合、条件式の戻り値は2です。シェルオプションnocasematchが有効になっている場合、アルファベット文字の大文字と小文字を区別せずに一致が実行されます。 パターンの任意の部分を引用符で囲んで、文字列として一致させることができます。

したがって、引用符では、古き良き文字列マッチングを使用しています。

パターンにスペースが必要な場合は、エスケープするだけです。

str="m   m"
if [[ ${str} =~ m\ +m ]]; then
21
Mat