4

bash バージョン 3 のサーバーでは、次のようにします。

bash3$ e="tar xfz"; [[ "$e" =~ "^tar" ]] && echo 0 || echo 1
0

しかし、bash バージョン 4 で同じコマンドを実行すると

bash4$ e="tar xfz"; [[ "$e" =~ "^tar" ]] && echo 0 || echo 1
1

CentOS、Fedora、Ubuntu で試してみましたが、同じ結果が得られました。なにが問題ですか?

4

2 に答える 2

8

Greg's Wikiからの正規表現に関するセクションの引用:

3.2 より前では、正規表現パターンを引用符で囲んでも安全でしたが、3.2 ではこれが変更されました。それ以来、正規表現は常に引用符で囲まないようにする必要があります。

これは、最も互換性のある使用方法です=~

e='tar xfz'
re='^tar'
[[ $e =~ $re ]] && echo 0 || echo 1

これは、両方のバージョンの bash で機能するはずです。

于 2016-06-02T18:35:04.170 に答える