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