Bash: Pourquoi egrepping pour cette chaîne réussit-il?

J’essaie de vérifier si un commutateur d’aide a été transmis à mon programme en le remplaçant par -? , -h ou --help . Sinon, je transfère tout simplement à un autre script, comme ceci:

 if echo "$*" | egrep -q -- '-?|-h|--help'; then help exit 0 fi exec another/script "$@" 

Pour une raison quelconque, cela ne semble pas fonctionner sur mon système. Je l’ai egrep jusqu’au fait que egrep revenait avec succès pour les recherches sur la chaîne vide, par exemple cela imprimera 0 :

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

Pourquoi cela se produit-il et que puis-je faire pour y remédier? Merci!


edit: Aussi juste remarqué que pendant que cette commande réussira:

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

L’utiliser avec grep normal échouera:

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

Je suppose que le grep étendu traite ? comme personnage spécial, alors?

Dans les expressions régulières ? signifie zéro ou une copie du caractère précédent, qui dans ce cas est - . Alors le -? signifie zéro ou une correspondance de - . Zéro correspond à - correspond à la chaîne vide, donc cette expression régulière correspond à tout. Vous devez échapper à la ? il sera donc interprété littéralement, pas comme un métacaractère d’expression régulière.

 egrep -q -- '-\?|-h|--help' 

C’est parce que est un caractère de modèle spécial dans le shell et il est traité différemment dans une expression régulière . Regardez l’homme bash:

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

Donc dans votre exemple:

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

'?' est zéro ou 1 répétitions du caractère précédent - . (comme indiqué correctement dans les commentaires) Dans une expression régulière '?' perd sa signification particulière pour correspondre à un seul caractère et signifie à la place une correspondance de zero ou 1 fois. Pour préserver le personnage lui-même, vous auriez besoin d’une demande explicite pour - et ? eux-mêmes comme dans une classe de caractères

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