2

bash スクリプトで単純な正規表現を照合しようとしています。GNU bash バージョン 4.2.24(1)-release (x86_64-pc-linux-gnu) では期待どおりに動作しますが、 GNU bash バージョン 3.2.25(1)-release (x86_64-redhat-linux- gnu)では動作しません。 )

コードは次のとおりです。


#!/bin/bash

line="[foo]"
[[ $line =~ ^\[.*\]$ ]] && echo "regex matched"
echo "value of \$? : " $?
echo "value of BASH_REMATCH : " $BASH_REMATCH
/bin/bash --version|grep "GNU bash"

これは、GNU bash、バージョン 4.2.24(1)-release (x86_64-pc-linux-gnu)の出力です。

$? の正規表現一致
値 : BASH_REMATCH の 0
の値: [foo]
GNU bash、バージョン 4.2.24(1)-release (x86_64-pc-linux-gnu)

これは、GNU bash、バージョン 3.2.25(1)-release (x86_64-redhat-linux-gnu)の出力です。

$の値?
: BASH_REMATCH の1 つの値:
GNU bash、バージョン 3.2.25(1)-release (x86_64-redhat-linux-gnu)

=~の演算子の動作に関して、ここや他の場所で多くの投稿を読みましたが、同じ問題を抱えている人を見つけることができません。bash 3.2 で大きな変更があったことがわかりましたが、私が見る限り、3.2 以降は機能するはずです。

4

1 に答える 1

2

ある種のエスケープの問題のように見えます。

これはここで機能します(bashバージョン3.2.25(1)-release):

line="[foo]"
bar="^\[.*\]$"
[[ $line =~ $bar ]] && echo "regex matched"

これも機能するようです:

[[ $line =~ ^\\[.*\\]$ ]] && echo "regex matched"
于 2013-03-06T17:23:34.113 に答える