Ich habe mir ein Linux-Programm geschrieben program
, das einen regulären Ausdruck als Eingabe benötigt.
Ich möchte das Programm in der bash
Shell aufrufen und diesen regulären Ausdruck als Befehlszeilenargument an das Programm übergeben (es gibt auch andere Befehlszeilenargumente). Ein typischer regulärer Ausdruck sieht aus wie
[abc]\_[x|y]
Leider sind die Zeichen [
, ]
und |
Sonderzeichen in bash
. Also anrufen
program [abc]\_[x|y] anotheragument
funktioniert nicht Gibt es eine Möglichkeit, den Ausdruck mit Escape-Zeichen, Anführungszeichen usw. zu übergeben?
(Der Aufruf program "[abc]\_[x|y] anotheragument"
funktioniert auch nicht, da die beiden Argumente als eins interpretiert werden.)
quelle
"$HOME"
"${USER:-root}"
"$(date)"
"`date`"
"$((1 + 2))"
"!!"
"\\"
Verwenden Sie einfache Anführungszeichen. Einfache Anführungszeichen stellen sicher, dass keines der Zeichen interpretiert wird.
Es gibt zwei Lösungen, wenn Sie ein einzelnes Anführungszeichen einbetten müssen:
quelle
Pro
man bash
quelle
Sie können einen Backslash (
\
) vor Sonderzeichen verwenden, um diese wie folgt zu maskieren:quelle
Obwohl es möglicherweise nicht als regulärer Ausdruck nützlich ist, können einige Zeichenfolgen als Bash-Variablennamen interpretiert werden. Verwenden Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen, um dies zu verhindern und zu vermeiden, dass sie erweitert werden:
Zitieren Sie jedes Argument separat (wenn es zitiert werden muss), damit es als unabhängige Argumente interpretiert wird. In einigen Fällen können Sie auch Arrays verwenden:
quelle
quelle
Es sollte gut funktionieren, wenn Sie ihnen entkommen:
quelle
Woher kommt das Muster? Ist es behoben oder von einem Benutzer? Ist es der Benutzer, der das Skript auf dem lokalen System aufruft, oder eine entfernte Person?
Sie setzen Daten in Anführungszeichen, um zu verhindern, dass die Shell sie interpretiert. Es gibt zwei Möglichkeiten:
Da
$
es sich um ein gültiges Zeichen in regulären Ausdrücken (Zeilenende / Puffer) handelt, möchten Sie wahrscheinlich einfache Anführungszeichen verwenden, um den regulären Ausdruck zu speichern, es sei denn, Sie speichern ihn in einer Variablen. Wenn Sie nicht vertrauenswürdig beliebige Daten von jemandem nehmen, müssen Sie ersetzen'
mit'"'"'
und wickeln dann in einfachen Anführungszeichen.Beachten Sie, dass
[abc]_[x|y]
Siex
odery
übereinstimmen möchten , während tatsächlich eines der drei Zeichen übereinstimmtxy|
. Die eckigen Klammern entsprechen den Zeichen innerhalb und nur-
für Bereiche und a^
am Anfang für die Negation. So[abc]_(x|y)
könnte das sein , was Sie gemeint, und die Klammern sind die Zeichen , die zu schälen sind etwas Besonderes. Eckige Klammern sind nichts Besonderes an der Schale, sie sehen einfach so aus, wie sie sind. Doppelte eckige Klammern[[ ... ]]
sind etwas Besonderes.quelle
'
durch'"'"'
), aber es ist immer noch nicht richtig.[
IS ein spezielles Zeichen für Shell, wird es in Platzhaltern verwendet, wenn Pfaderweiterungen durchgeführt werden (welche Shell für alles, was nicht in Anführungszeichen steht, verwendet wird).foo=a[b]
und dannecho $foo
sehen, dass die Zeichenfolge kein Anführungszeichen benötigt. Du hast recht, ich war zu kurz.ab
im aktuellen Verzeichnis undfoo
enthält dannab
eher alsa[b]
. Zitieren Sie Ihre eckigen Klammern, Leute.setopt glob_assign
dieses Verhalten auch aktivieren, daher ist das Zitieren die sicherste Antwort.