Frage In Bash, wie entkomme ich einem Ausrufezeichen?


Ich möchte sowas machen bzr commit -m "It works!". Ich kann sozusagen dem Ausrufezeichen entkommen bzr commit -m "It works\!". Allerdings enthält meine Commit-Nachricht den umgekehrten Schrägstrich. Wie kann ich das Ausrufezeichen verlassen, ohne den Backslash zu ignorieren?


163
2018-04-22 18:53


Ursprung


Tun bzr commit -m "It works"! funktioniert auch. - kba
Wie ich schon erwähnt habe, funktioniert der Befehl tatsächlich auf eigene Weise :) bzr commit -m "It works!" - h4unt3r
Ein noch seltsamer Fall mit verschachtelten Zitaten: stackoverflow.com/questions/22125658/ ... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Obwohl die akzeptierte Antwort ein guter Workaround für Ihre Commit-Probleme ist, denke ich, dass es keine Antwort auf das eigentliche Problem ist: Bash-Geschichte Erweiterung. Bitte überlege, Dennis 'Antwort zu akzeptieren. - Arjan


Antworten:


Da Sie nicht auf bash angewiesen sind, um Variablen in Ihrer Commit-Nachricht zu erweitern, können Sie stattdessen einfache Anführungszeichen verwenden. Strings in einfachen Anführungszeichen werden nicht durch bash erweitert.

bzr commit -m 'This does work!' 

134
2018-04-22 19:31



Da war die Frage "Wie entkomme ich einem Ausrufezeichen?" und nicht "Wie erweitere ich kein Ausrufezeichen?" Ich denke nicht, dass das gültig ist. Es gibt einige Male (wie das Übergeben von Apostrophen und Ausrufezeichen in derselben Befehlszeile) dass das nicht funktioniert. Die folgende Antwort funktioniert viel besser, um das zu tun, was viele Leute brauchen. - Jann
@Jann: Du hast 100% Recht, aber ich denke, das Problem ist hier das mit so vielen Fragen an Superuser: Beantworten wir die Frage auf den Punkt, oder helfen wir Menschen, ihr spezifisches Problem zu lösen. Ich denke, beide Wege können nützlich sein, und dies war auf der Suche nach Hilfe zu einem bestimmten Thema. - Benjamin Bannier
Touché! Dies war ein spezifisches Problem. Ich möchte nur eine Antwort auf meine Fragen, um in vielen Situationen verwendet werden zu können. pS: Der Grund, warum ich das erwähnte, war, dass ich sowohl ein Apostroph als auch ein Ausrufezeichen an ein Perl-Programm übergeben musste und ich die folgende Lösung benötigte. :) - Jann
Ich stimme sowohl Benjamin als auch Jann zu, gab aber einen Downvote. Der Titel der Frage wird von Suchmaschinen indexiert und so kam ich hierher und wahrscheinlich kommen die meisten Benutzer hierher. Deshalb glaube ich, dass es wichtig ist, dass die eigentliche Frage das Problem dahinter widerspiegelt. In anderen Foren wird den Leuten geraten (fast gezwungen) genau zu fragen, wonach sie suchen. Die Beantwortung von schlecht geäußerten Fragen unterstützt Schlamperei und das ist der genaue Grund für meinen Downvote hier. Als Kompromiss / Lösung ist mein Vorschlag, die Überschrift so anzupassen, dass sie das tatsächliche Problem widerspiegelt. - ChristophK


Alte Frage, die ich kenne, aber für zukünftige Suchende:

Sie können diese Methode auch verwenden, wenn Sie doppelte Anführungszeichen sowie den Ausruf möchten:

echo "It's broken"'!'

Das funktioniert auch wenn der ! ist nicht am Ende der Linie.

Zum Beispiel:

echo "hello there"'!'" and goodbye"

Bonus: Eine ähnliche Technik kann verwendet werden, um zu entkommen irgendein Text in Sh oder Bash (mit Hilfe von sed): siehe die erste Option in diese Antwort. Außerdem, wenn Sie haben bash-completion installiert haben, haben Sie wahrscheinlich das quote() Funktion bereits verfügbar.


139
2018-06-23 19:16



Netter Tipp, JWD. Ich wusste nicht, dass Bash-Strings miteinander verkettet werden könnten, indem Leerräume zwischen ihnen weggelassen wurden. - Alan H.
Wenn das Ausrufezeichen am Ende der Zeichenkette steht, sind Sie im Klartext echo "Happy birthday!" wird wie erwartet funktionieren, sonst kannst du es mit einem Backslash umgehen, aber der Backslash wird auch gedruckt. XD Bash ist nichts für schwache Nerven :) - h4unt3r
@ h4unt3r: Komisch, das ist nicht meine Erfahrung. Für mich, echo "Happy Birthday!" gibt 2 Zeilen aus. Das erste ist echo "Happy birthday" (kein Ausruf), und der zweite ist "Herzlichen Glückwunsch zum Geburtstag" (wieder, kein Ausruf). Haben Sie die Verlaufserweiterung aktiviert, wenn Sie diesen Test durchführen? - jwd
@jwd Welche Version von Bash spielst du? Ich habe immer Hist Expansion auf. Hast du versehentlich zwei benutzt !! für deinen Test? - h4unt3r
@ h4unt3r: version 4.1.2(1)-release (x86_64-redhat-linux-gnu), definitiv nur einer ! verwendet werden. ich habe histexpand anwesend in $SHELLOPTS. Allerdings habe ich gerade 4.3.18 (2) -Release auf einem anderen Rechner versucht, und es verhält sich wie Sie beschrieben. Ich denke, es war ein Fehler, der behoben wurde. - jwd


Abschalten Geschichte Erweiterung:

set +H

oder

set +o histexpand

63
2018-04-22 18:58



Danke - das hat funktioniert, aber ich musste es tun set +o histexpandnicht set -o histexpand. Könnten Sie Ihre Antwort bearbeiten, um dies zu beheben? - Matthew
Ups, Tippfehler, tut mir leid. Fest. - Dennis Williamson
hervorragend! Ich suchte dieses für AGES .... thx vm! als Escape wird nicht funktionieren ... Ich möchte auch keine einfachen Anführungszeichen verwenden ... Ich werde das zu meinem hinzufügen .bashrc thx !!, nie benutzt ! in Skripten und für nichts !! es war immer beunruhigend ... - Aquarius Power
Das ist so großartig! echo "@AquariusPower!" - joehanna


Verwenden Sie einfache Anführungszeichen (') anstelle von doppelten Anführungszeichen ("). Einfache Anführungszeichen schalten alle Interpretationen der Inhalte in ihnen aus, während doppelte Anführungszeichen nur einige ausschalten.

bzr commit -m 'It works!'

9
2018-04-22 19:32





Ich habe gerade einen anderen Weg gefunden, mit dem es zumindest arbeiten wird echoZeichenketten (Sätze), die Sie mit einem Ausrufezeichen unterstreichen möchten. Es macht mehr oder weniger einen Endlauf um Bash histexpand und dauert nur ein bisschen länger.

Das Hex für ein Ausrufezeichen, wie auf aufgelistet http://www.ascii-code.com/, ist 21, also wenn Sie setzen \x21 am Ende der Zeichenfolge, echo -e $foo, machen $foo sein eigenes erweitertes Echo [dh foo=$(echo -e "$foo")], was du bekommst, wenn du echo $foo wieder ist die Saite mit einem ! Am Ende. Und auch kein Umschalten.

Funktioniert sicher in Bash 4+. Frühere Versionen, ymmv.


4
2017-11-23 04:28



Hmmm, es funktioniert nicht für mich. - lzap