Ich möchte so etwas tun bzr commit -m "It works!"
. Ich kann dem Ausrufezeichen irgendwie entkommen, indem ich tue bzr commit -m "It works\!"
. Meine Festschreibungsmeldung enthält dann jedoch den umgekehrten Schrägstrich. Wie kann ich mich dem Ausrufezeichen entziehen, ohne den Backslash zu beachten?
bash
syntax
escape-characters
Matthew
quelle
quelle
bzr commit -m "It works"!
funktioniert auch.bzr commit -m "It works!"
Antworten:
Da Sie nicht auf bash angewiesen sind, um Variablen in Ihrer Festschreibungsmeldung zu erweitern, können Sie stattdessen einfache Anführungszeichen verwenden. Zeichenfolgen in einfachen Anführungszeichen werden nicht durch Bash erweitert.
quelle
Ist hier eine andere Methode, wenn Sie doppelte Anführungszeichen sowie das Ausrufezeichen wünschen:
Dies funktioniert auch, wenn sich das
!
nicht am Ende der Zeile befindet.Zum Beispiel:
Bonus: Eine ähnliche Technik verwendet werden kann , zu entkommen beliebigen Text in Sh oder Bash (mit Hilfe von sed): siehe die ersten Option in dieser Antwort . Wenn Sie
bash-completion
installiert haben, ist diequote()
Funktion wahrscheinlich bereits verfügbar.quelle
echo "Happy birthday!"
funktionieren Sie im Klartext wie erwartet. Andernfalls können Sie es mit einem Backslash umgehen, aber der Backslash wird auch gedruckt. XD Bash ist nichts für schwache Nerven :)echo "Happy Birthday!"
gibt 2 Zeilen aus. Das erste istecho "Happy birthday"
(kein Ausrufezeichen) und das zweite ist "Alles Gute zum Geburtstag" (wieder kein Ausrufezeichen). Haben Sie die Verlaufserweiterung aktiviert, wenn Sie diesen Test durchführen?version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
definitiv nur einer!
wird verwendet. Ich habehistexpand
anwesend in$SHELLOPTS
. Ich habe jedoch gerade versucht, 4.3.18 (2) auf einem anderen Computer zu veröffentlichen, und es verhält sich so, wie Sie es beschrieben haben. Ich denke, es war ein Fehler, der behoben wurde.Schalten Sie Geschichte Expansion :
oder
Sie können einen dieser Befehle zu Ihrem hinzufügen,
~/.bashrc
wenn Sie normalerweise keine Verlaufserweiterung verwenden.Bash 4.3 hat einen Sonderfall hinzugefügt :
quelle
set +o histexpand
, nichtset -o histexpand
. Könnten Sie Ihre Antwort bearbeiten, um dies zu beheben?.bashrc
Dank hinzufügen !!, nie!
in Skripten verwendet und für nichts !! Es war immer beunruhigend ...echo "@AquariusPower!"
Verwenden Sie einfache Anführungszeichen (') anstelle von doppelten Anführungszeichen ("). Einfache Anführungszeichen deaktivieren die gesamte Interpretation der Inhalte in ihnen, während doppelte Anführungszeichen nur einige deaktivieren.
quelle
Ich habe gerade einen anderen Weg gefunden, der zumindest mit
echo
Strings (Sätzen) funktioniert, die Sie mit einem Ausrufezeichen versehen möchten. Es führt mehr oder weniger einen End-Run um Bash histexpand durch und dauert nur ein bisschen länger, um Code zu erstellen.Das Hexadezimal für ein Ausrufezeichen (siehe http://www.ascii-code.com/ ) ist 21. Wenn Sie also
\x21
das Ende Ihrer Zeichenfolge angebenecho -e $foo
, geben Sie$foo
ein eigenes erweitertes Echofoo=$(echo -e "$foo")
aus bekomme wenn duecho $foo
wieder den string mit einem!
am ende hast . Und auch keine Schaltverzögerung.Funktioniert auf jeden Fall in Bash 4+. Frühere Versionen, ymmv.
quelle
printf "OMG\041"
. Wenn Sie eine Zeichenfolge in doppelten Anführungszeichen erstellen, die weder echo noch printf enthält, können Sie sie$(echo -e "\041")
an der Stelle, an der sich das Ausrufezeichen befinden soll, in die Zeichenfolge einbetten . Wie folgt aus :bzr commit -m "This is a great commit$(echo -e "\041")"
.