42 votes

Bash: comment passer des arguments en ligne de commande contenant des caractères spéciaux

J'ai écrit moi-même un programme linux programme qui nécessite une expression régulière en entrée.

Je veux appeler le programme dans le shell bash et passer cette expression régulière en tant qu'argument de ligne de commande au programme (il y a également d'autres arguments de ligne de commande). Une expression régulière typique ressemble à

[abc]\_[x|y]

Malheureusement, les caractères [, ] et | sont des caractères spéciaux dans le bash. Ainsi, appeler

programme [abc]\_[x|y] unautreargument

ne fonctionne pas. Y a-t-il un moyen de passer l'expression en utilisant des caractères d'échappement ou des guillemets, etc. ?

(Appeler programme "[abc]\_[x|y] unautreargument" ne fonctionne pas non plus, car il interprète les deux arguments comme un seul.)

1voto

Witek Points 349
program "[abc]_[x|y]"
program "[abc]_[x|y]" unautreargument

0voto

Joe Points 2507

Les échapper devrait fonctionner correctement :

  programm \[abc\]_\[x\|y\]

0voto

Phil P Points 1913

D'où provient le motif? Est-il fixe ou provient-il d'un utilisateur? Est-ce l'utilisateur qui invoque le script sur le système local, ou quelqu'un à distance?

Vous utilisez des guillemets pour envelopper les données afin d'empêcher le shell de les interpréter. Il existe deux options:

  1. Des guillemets doubles, qui permettent toujours une certaine interprétation ($expand et `backticks`)
  2. Des guillemets simples, qui passent tout littéralement

Parce que $ est un caractère valide dans les expressions rationnelles (fin de ligne/tampon), vous voudrez probablement utiliser des guillemets simples pour contenir l'expression rationnelle, sauf si vous la stockez dans une variable. Si vous récupérez des données arbitraires d'une source non fiable, vous devrez remplacer ' par '"'"' puis l'envelopper de guillemets simples.

Remarquez que [abc]_[x|y] semble indiquer que vous voulez faire correspondre x ou y, alors qu'en réalité cela correspond à l'un des trois caractères xy|. Les crochets carrés correspondent aux caractères à l'intérieur, uniquement - pour les plages et un ^ au début pour la négation. Ainsi, [abc]_(x|y) pourrait être ce que vous vouliez dire, et les parenthèses sont les caractères spéciaux pour le shell. Les crochets carrés ne sont pas spéciaux pour le shell, ils ont juste l'air de l'être. Les doubles crochets [[ ... ]] sont spéciaux.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X