2016-07-08 16 views
0

bashの3とbashの4の間で同じ結果を出力しない正規表現のチェックとフォローコード:正規表現:bashの対はbash 3 4

TESTCASE="testcase0" 
[[ ${TESTCASE} =~ "^testcase[0-9\.]*$" ]] 
echo $? 
echo ${BASH_REMATCH} 

はbash 3.2出力成功した正規表現チェック:

0 
testcase0 

はbash 4.1は、正規表現のチェック失敗:

1 
<empty line> 

私は識別できないが、私の正規表現パターンは、式が失敗します。私は両方のバージョンのbashの間で互換性のあるコードが必要です。

誰かが私の問題点を把握していますか?

ありがとうございます!

+0

'3.2'は私の出力で空白行1 ...あなたは正規表現を引用することには関係ありません。 – 123

+0

私はレッドハットのマシンです。 – LAL

答えて

4

古いバージョンのBash(3.1)では、テストで正規表現を引用符で囲むことができました。より新しいバージョンでは、引用符はパターンの一部として扱われるため、照合は失敗します。

解決方法は、引用符を削除することです。


正規表現を使用する推奨方法はこれです:

re='^testcase[0-9\.]*$' # single quotes around variable 
[[ ${TESTCASE} =~ $re ]] # unquoted variable used in test 

この構文は、正規表現をサポートするのbashのすべてのバージョンで動作するはずです。この変数は厳密には必要ではありませんが、読みやすさが向上します。詳細については、Gregのwikiのregular expressions sectionを参照してください。 (上記のリンクから)変数の使用に関する

:クロス互換性のため

(括弧、パイプ等を脱出することを避けるために)自分の正規表現を格納するために変数を使用して、例えばre='^\*(>| *Applying |.*\.diff|.*\.patch)'; [[ $var =~ $re ]] ERE構文のみを記述し、シェルエスケープの必要性を避けるだけでなく、すべての3.x BASHバージョンと互換性があるので、これを維持する方がずっと簡単です。

ところで、括弧の中に.をエスケープする必要はありません。