Je me suis écrit un programme Linux program
qui a besoin d'une expression régulière en entrée.
Je veux appeler le programme dans le bash
shell et transmettre cette expression régulière en tant qu'argument de ligne de commande au programme (il existe é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 bash
. Ainsi, appeler
program [abc]\_[x|y] anotheragument
ne fonctionne pas. Existe-t-il un moyen de passer l'expression en utilisant une sorte de caractères d'échappement ou de guillemets, etc.?
(L'appel program "[abc]\_[x|y] anotheragument"
ne fonctionne pas non plus, car il interprète les deux arguments comme un seul.)
la source
"$HOME"
ou les paramètres d' extension"${USER:-root}"
, la substitution de commandes sous forme"$(date)"
ou"`date`"
l'expansion arithmétique, l'expansion de l'"$((1 + 2))"
historique"!!"
ou l'échappement de barre oblique inverse"\\"
. Utilisez plutôt des guillemets simples. Voir la page de manuel du manuel bash, la section intitulée "Quoting".Utilisez des guillemets simples. Les guillemets simples garantissent qu'aucun des caractères n'est interprété.
Il existe deux solutions si vous devez intégrer un devis unique:
la source
Par
man bash
la source
Vous pouvez utiliser une barre oblique inverse (
\
) devant les caractères spéciaux pour les échapper comme ceci:la source
Bien qu'il puisse ne pas être utile comme expression régulière, certaines séquences de caractères peuvent être interprétées comme des noms de variables Bash. Pour éviter cela et éviter de les développer, utilisez des guillemets simples au lieu de guillemets doubles:
Citez chaque argument séparément (s'ils ont besoin d'être cités) afin qu'ils soient interprétés comme des arguments indépendants. Vous pouvez également utiliser des tableaux dans certains cas:
la source
la source
Les échapper devrait fonctionner correctement:
la source
D'où vient le motif? Est-ce fixe ou d'un utilisateur? Est-ce l'utilisateur qui invoque le script sur le système local ou quelqu'un distant?
Vous utilisez des guillemets pour envelopper les données pour empêcher le shell de les interpréter. Il y a deux options:
Parce qu'il
$
s'agit d'un caractère valide dans les expressions rationnelles (fin de ligne / tampon), vous souhaiterez probablement utiliser des guillemets simples pour contenir l'expression rationnelle, à moins que vous ne stockiez dans une variable. Si vous prenez des données arbitraires d'une personne non fiable, vous devrez remplacer'
par'"'"'
, puis encapsuler des guillemets simples.Notez que cela
[abc]_[x|y]
semble correspondre àx
ouy
, alors qu'il correspond en fait à l'un des trois caractèresxy|
. Les crochets correspondent aux caractères à l'intérieur et uniquement-
pour les plages et^
au début pour la négation. Donc, c'est[abc]_(x|y)
peut-être ce que vous vouliez dire, et les parenthèses sont les caractères qui sont spéciaux pour shell. Les crochets ne sont pas spéciaux pour le shell, il semble qu'ils le soient. Les crochets doubles[[ ... ]]
sont spéciaux.la source
'
par'"'"'
), mais elle n'est toujours pas correcte.[
EST un caractère spécial à décortiquer, il est utilisé dans les caractères génériques lors de l'extension de chemin (ce que fait le shell pour tout ce qui n'est pas cité).foo=a[b]
et puisecho $foo
et voir que la chaîne n'a pas besoin de guillemets. Tu as raison, j'étais trop bref.ab
dans le répertoire courant, etfoo
contiendra alorsab
plutôt quea[b]
. Citez vos crochets, mes amis.setopt glob_assign
activer ce comportement, donc la citation est la réponse la plus sûre.