1433 Stimmen

Wie werden einfache Anführungszeichen innerhalb von Zeichenketten mit einfachen Anführungszeichen aufgehoben?

Nehmen wir an, Sie haben einen Bash alias mögen:

alias rxvt='urxvt'

was gut funktioniert.

Allerdings:

alias rxvt='urxvt -fg '#111111' -bg '#111111''

wird nicht funktionieren, und das wird es auch nicht:

alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''

Wie lassen sich also öffnende und schließende Anführungszeichen innerhalb einer Zeichenkette zuordnen, wenn Sie Anführungszeichen escaped haben?

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''

scheint unhandlich, obwohl es dieselbe Zeichenkette darstellen würde, wenn man sie auf diese Weise verketten darf.

33 Stimmen

Ist Ihnen klar, dass Sie für Alias keine einfachen Anführungszeichen verwenden müssen? Doppelte Anführungszeichen sind viel einfacher.

8 Stimmen

6 Stimmen

Verschachtelte doppelte Anführungszeichen sind ausweichbar, "\"" daher sollten diese, wann immer möglich, der Antwort von @liori vorgezogen werden.

29voto

Beide Versionen funktionieren, entweder mit Verkettung unter Verwendung des maskierten einfachen Anführungszeichens (\') oder mit Verkettung durch Einschließen des einfachen Anführungszeichens in doppelte Anführungszeichen ("'").

Der Verfasser der Frage hat nicht bemerkt, dass am Ende seines letzten Ausbruchsversuchs ein zusätzliches einfaches Anführungszeichen (') stand:

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
                    |                   
           STRINGSTRINSTRSTRIN

                          All escaped single quotes    

                                                       ?

Wie Sie in dem vorangegangenen netten ASCII/Unicode-Kunstwerk sehen können, folgt auf das letzte maskierte einfache Anführungszeichen (\') ein unnötiges einfaches Anführungszeichen ('). Die Verwendung eines Syntax-Highlighters, wie er in Notepad++ vorhanden ist, kann sich als sehr hilfreich erweisen.

Das Gleiche gilt für ein anderes Beispiel wie das folgende:

alias rc='sed '"'"':a;N;$!ba;s/\n/, /g'"'"
alias rc='sed '\'':a;N;$!ba;s/\n/, /g'\'

Diese beiden schönen Beispiele für Aliasnamen zeigen auf sehr komplizierte und verschleierte Weise, wie eine Datei aufgereiht werden kann. Das heißt, aus einer Datei mit vielen Zeilen wird nur eine Zeile mit Kommas und Leerzeichen zwischen dem Inhalt der vorherigen Zeilen. Um den Sinn des vorangegangenen Kommentars zu verdeutlichen, folgt nun ein Beispiel:

$ cat Little_Commas.TXT
201737194
201802699
201835214

$ rc Little_Commas.TXT
201737194, 201802699, 201835214

7 Stimmen

Upwoted für die ASCII-Tabelle Illustration :)

1 Stimmen

Wie haben Sie diese Unicode-Kunstwerke erstellt? Es ist wunderschön!

28voto

Gabriel Staples Punkte 20228

Wie werden einfache Anführungszeichen ( ' ) und doppelte Anführungszeichen ( " ) mit hex y oktal Zeichen

Wenn Sie etwas wie echo Ich hatte schon einige wirklich komplizierte, seltsame und schwer zu entschlüsselnde (z. B. sehr verschachtelte) Fälle, bei denen ich nur mit Oktal- oder Hex-Codes arbeiten konnte!

Hier sind einige einfache Beispiele, um zu zeigen, wie es funktioniert:

1. Beispiel für einfache Anführungszeichen, wobei ' wird entkommen mit hex \x27 o oktal \047 (die entsprechende ASCII-Code ):

  1. hex \x27

    echo -e "Let\x27s get coding!"
    # OR
    echo -e 'Let\x27s get coding!'

    Ergebnis:

    Let's get coding!
  2. oktal \047

    echo -e "Let\047s get coding!"
    # OR
    echo -e 'Let\047s get coding!'

    Ergebnis:

    Let's get coding!

2. Beispiel für Anführungszeichen, wobei " wird entkommen mit hex \x22 o oktal \042 (die entsprechende ASCII-Code ).

Nota: bash ist verrückt! Manchmal sogar die ! char hat besondere Bedeutung sein und muss entweder innerhalb der doppelten Anführungszeichen entfernt und entkam dann "like this"\! oder vollständig in einfache Anführungszeichen setzen 'like this!' und nicht in Anführungszeichen.

# 1. hex; also escape `!` by removing it from within the double quotes 
# and escaping it with `\!`
$ echo -e "She said, \x22Let\x27s get coding"\!"\x22"
She said, "Let's get coding!"

# OR put it all within single quotes:
$ echo -e 'She said, \x22Let\x27s get coding!\x22'
She said, "Let's get coding!"

# 2. octal; also escape `!` by removing it from within the double quotes 
$ echo -e "She said, \042Let\047s get coding"\!"\042"
She said, "Let's get coding!"

# OR put it all within single quotes:
$ echo -e 'She said, \042Let\047s get coding!\042'
She said, "Let's get coding!"

# 3. mixed hex and octal, just for fun
# also escape `!` by removing it from within the double quotes when it is followed by
# another escape sequence
$ echo -e "She said, \x22Let\047s get coding! It\x27s waaay past time to begin"\!"\042"
She said, "Let's get coding! It's waaay past time to begin!"

# OR put it all within single quotes:
$ echo -e 'She said, \x22Let\047s get coding! It\x27s waaay past time to begin!\042'
She said, "Let's get coding! It's waaay past time to begin!"

Beachten Sie, dass wenn Sie nicht ordnungsgemäß entkommen ! wie ich oben zwei Möglichkeiten aufgezeigt habe, erhalten Sie einige seltsame Fehlermeldungen etwa so:

$ echo -e "She said, \x22Let\047s get coding! It\x27s waaay past time to begin!\042"
bash: !\042: event not found

OR:

$ echo -e "She said, \x22Let\x27s get coding!\x22"
bash: !\x22: event not found

Eine weitere Alternative: Dies erlaubt eine gemischte Expansion und Nicht-Expansion innerhalb desselben Bash-Strings

Hier ist eine weitere Demo einer alternativen Escape-Technik.

Erstens: Lesen Sie die Hauptantwort von @liori um zu sehen, wie das 2. Formular unten funktioniert. Lesen Sie nun diese beiden alternativen Möglichkeiten, um Zeichen zu entkommen. Beide Beispiele sind in ihrer Ausgabe identisch:

CMD="gs_set_title"

# 1. 1st technique: escape the $ symbol with a backslash (\) so it doesn't 
# run and expand the command following it
echo "$CMD '\$(basename \"\$(pwd)\")'"

# 2. 2nd technique (does the same thing in a different way): escape the 
# $ symbol using single quotes around it, and the single quote (') symbol
# using double quotes around it
echo "$CMD ""'"'$(basename "$(pwd)")'"'"

Beispielhafte Ausgabe:

gs_set_title '$(basename "$(pwd)")'
gs_set_title '$(basename "$(pwd)")'

Anmerkung: für meine gs_set_title bash-Funktion, die ich habe in meinem ~/.bash_aliases Datei irgendwo hier siehe meine andere Antwort hier .

Referenzen:

  1. https://en.wikipedia.org/wiki/ASCII#Printable_characters
  2. https://serverfault.com/questions/208265/what-is-bash-event-not-found/208266#208266
  3. Siehe auch meine andere Antwort hier: Wie schreibe ich Nicht-ASCII-Zeichen mit echo? .

0 Stimmen

Können Sie mir dabei helfen? Ich bin nicht sicher, wie ich mit dem ! Punkt hier. ssh server "awk 'del=(a&&a--) {print; da=\!a} $0~pattern{if (da) {print "--"; da=0} a=A; if (B) {for(i=NR; i<B+NR; i++) if((i%B) in b) print b[i%B]} {print; da=1}} (B) {if (del) delete b[NR%B]; else b[NR%B]=$0}' B=5 A=2 pattern=Successful file"

1 Stimmen

@cokedude, versuchen Sie, eine neue Frage zu stellen. Fügen Sie einen Link zu Ihrer neuen Frage hier ein, damit ich Ihnen bei Ihrer Frage helfen kann.

0 Stimmen

Ist es besser, im normalen Stackoverflow oder im Unix-Stackoverflow zu posten?

21voto

kenorb Punkte 134883

Einfaches Beispiel für das Escapen von Anführungszeichen in der Shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Dies geschieht durch das Beenden eines bereits geöffneten ( ' ), die Platzierung von escaped one ( \' ), dann das Öffnen eines weiteren ( ' ). Diese Syntax funktioniert für alle Befehle. Es ist ein sehr ähnlicher Ansatz wie in der ersten Antwort.

18voto

nicerobot Punkte 8777

Ich gehe nicht speziell auf die Frage des Zitierens ein, denn manchmal ist es einfach sinnvoll, einen alternativen Ansatz in Betracht zu ziehen.

rxvt() { urxvt -fg "#${1:-000000}" -bg "#${2:-FFFFFF}"; }

die Sie dann als aufrufen können:

rxvt 123456 654321

Der Gedanke dahinter ist, dass Sie jetzt einen Alias verwenden können, ohne sich um Anführungszeichen kümmern zu müssen:

alias rxvt='rxvt 123456 654321'

oder, falls Sie die # aus irgendeinem Grund in allen Anrufen:

rxvt() { urxvt -fg "${1:-#000000}" -bg "${2:-#FFFFFF}"; }

die Sie dann als aufrufen können:

rxvt '#123456' '#654321'

dann ist es natürlich ein Alias:

alias rxvt="rxvt '#123456' '#654321'"

(ups, ich glaube, ich habe das Zitieren irgendwie angesprochen :)

1 Stimmen

Ich habe versucht, etwas in einfache Anführungszeichen zu setzen, das in doppelten Anführungszeichen stand, die ihrerseits in einfachen Anführungszeichen standen. Igitt. Vielen Dank für Ihre Antwort "versuchen Sie einen anderen Ansatz". Das hat den Unterschied gemacht.

1 Stimmen

Ich bin zwar 5 Jahre zu spät dran, aber fehlt da nicht ein einzelnes Anführungszeichen in Ihrem letzten Alias?

1 Stimmen

@Julien Ich sehe kein Problem ;-)

16voto

user2297550 Punkte 2727

Es ist eine minimale Antwort erforderlich, damit die Leute loslegen können, ohne viel Zeit damit zu verbringen, die Reden der Leute zu sichten.

Es gibt keine Möglichkeit um einfache Anführungszeichen zu vermeiden oder etwas anderes in einfachen Anführungszeichen.

Der folgende Befehl ist, vielleicht überraschenderweise, ein vollständiger Befehl:

$ echo '\'

dessen Ausgabe ist:

\

Backslashes, selbst für langjährige Bash-Benutzer überraschend, haben innerhalb von einfachen Anführungszeichen keine Bedeutung. Genauso wenig wie alles andere.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X