2016-03-24 6 views
1

私はヘルプスイッチが私のプログラムに-?-h、または--helpのためにそれをegreppingすることによって渡されたかどうか確認しようとしています。ない場合は、単に前方Iそうのような別のスクリプトに至るまで、いくつかの理由Bash:なぜこの文字列のegreppingが成功するのですか?

if echo "$*" | egrep -q -- '-?|-h|--help'; then 
    help 
    exit 0 
fi 

exec another/script "[email protected]" 

、これは私のシステム上で動作していないようです。 egrepが空の文字列の検索で正常に返されたという事実まで、私はそれを追跡しました。これは0を印刷します:

echo '' | egrep -q -- '-?|-h|--help' 
echo $? 

なぜこれが起こるんし、私はそれを修正するために何ができるのでしょうか?ありがとう!


編集:

echo -h | egrep -- -? 
echo $? # 0 

を定期的にgrepでそれを使用すると失敗します:はまた、ちょうどこのコマンドが成功する一方で気づい

echo -h | grep -- -? 
echo $? # 1 

を私は拡張のgrepを想定しています特殊文字として?を扱っていますか?

答えて

2

が必要になります-です。したがって、-?は、-の0件または1件の一致を意味します。 -の0の一致が空の文字列と一致するため、この正規表現はすべて一致します。 ?をエスケープする必要があります。つまり、正規表現のメタ文字ではなく、文字通り解釈されるようにしてください。

1

?はシェル内の特殊パターン文字であり、正規表現で扱いが異なるためです。男のbashのを見てみましょう:

Pattern Matching 
... 
The special pattern characters have the following meanings: 
... 
?  Matches any single character 

だからあなたの例では:

echo -h | egrep -- -? 
echo $? # 0 

'?'は、先行する文字-のゼロまたは1回の繰り返しです。 (コメントに正しく指摘されているように)正規表現'?'は、1文字と一致する特別な意味を失い、代わりにzeroまたは1回の一致を意味します。文字自体を維持するには、?、この場合では、先行する文字の0または1のコピーを意味し、そのよう文字クラスのように-?のための明示的な要求そのもの正規表現で

echo -h | egrep -- [-][?] 
echo $? 
1 
+0

正規表現の中で何かを意味するのではなく、 "一文字"を意味するのではなく "0または1"を意味するので、 ' - ?' 'または空の文字列と空の文字列*は常に一致しますか? –

+0

あなたが与える 'man bash'への言及は、正規表現ではなく、globを記述します。 –

+0

* man bash *への参照は、* Pattern Matching *への参照でした。 - ありがとうございました。はい、私は明確ではありませんでした。 –

関連する問題