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 で試してみましたが、同じ結果が得られました。なにが問題ですか?
Greg's Wikiからの正規表現に関するセクションの引用:
3.2 より前では、正規表現パターンを引用符で囲んでも安全でしたが、3.2 ではこれが変更されました。それ以来、正規表現は常に引用符で囲まないようにする必要があります。
これは、最も互換性のある使用方法です=~。
e='tar xfz'
re='^tar'
[[ $e =~ $re ]] && echo 0 || echo 1
これは、両方のバージョンの bash で機能するはずです。