この正規表現が機能しないのはなぜですか?

この正規表現が機能しないのはなぜですか?

git status -sツリーに追跡されていないファイルがあるかどうかを確認するために見たい出力です。次のテストを試しましたが、正規表現が一致しません。なぜできないの?

$ git status -s
## master
 M updated-file
?? new-file
$ [[ $(git status -s) =~ ^\?\? ]] || echo "no match"
no match

また、追加/修正/削除されたファイルを同じ方法でテストできることを願っています。私は通常^\s*[AMD]この目的のためにこのようなものを使用しますが、それも機能しません。何を提供しますか?

答え1

文字列の各行ではなく文字列全体を一致させるので、実際にはその正規表現##内でテストしています。

grepより良い選択です:

if ! git status -s | grep -q '^??'; then
    echo "no match"
fi

要求に応じて追加/変更/削除に対して同じことを行うことができます。

git status -s | grep '^ *[AMD]'

git status --porcelainもう少し構文解析指向の方法(このオプションは1.7.0に初めて登場)を見ることもできます。

関連情報