Wie entkomme ich einem einfachen Anführungszeichen in einer einfachen Anführungszeichenfolge in Bash?

70

Ich möchte einen String wie diesen in Bash anzeigen

I'm a student

Natürlich können Sie es so machen

echo "I'm a student"

Aber wie kann dies erreicht werden, während ein einfaches Anführungszeichen um die Zeichenfolge verwendet wird?

爱国者
quelle
4
Es gibt leider keine Möglichkeit, ein einfaches Anführungszeichen zwischen einfache Anführungszeichen zu setzen. Siehe gnu.org/software/bash/manual/bashref.html#Special-Parameters im Abschnitt3.1.2.2 Single Quotes
爱国者
Und wie geht es dir in einem Drehbuch? su -c '/etc/init.d/myservice start' -l myuser(von root geführt)
Sandburg

Antworten:

129
echo 'I\'m a student'

funktioniert nicht. Aber folgendes funktioniert:

echo $'I\'m a student'

Aus der Manpage von bash:

Ein einfaches Anführungszeichen darf nicht zwischen einfachen Anführungszeichen stehen, selbst wenn ein Backslash vorangestellt ist.
....
Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert, wobei Zeichen mit Backslash-Escapezeichen gemäß ANSI C-Standard ersetzt werden.

Codaddict
quelle
3
Eine hässlichere Form ist: "Ich" "ein Student"
Glenn Jackman
3
echo $'I\'m a student!'=> !': event not found, dies ist keine echte Zeichenfolge in einfachen Anführungszeichen, die in Bash vor jeder Interpretation schützen sollte.
Regilero
1
@regilero Welche Versionen haben Probleme damit? Ich sehe diesen Fehler nicht in Bash 4.1.2.
Sappjw
@sappjw OS X Bash:$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
Vladimir Rozhkov
Aus diesem Grund verwende ich Python jetzt als Ersatz für Bash-Skripte.
Sudo
59

Die von Glenn Jackman erwähnte "hässliche" Lösung sollte eigentlich als Antwort auf höchster Ebene aufgeführt werden. Es funktioniert gut und ist in manchen Situationen sogar schön.

'I'"'"'m a student'

Dies beendet die Zeichenfolge in einfachen Anführungszeichen, nachdem Isofort eine Zeichenfolge in doppelten Anführungszeichen mit einem einfachen Anführungszeichen und dann eine weitere Zeichenfolge in einfachen Anführungszeichen gestartet wird. Bash verkettet dann alle zusammenhängenden Zeichenfolgen zu einer.

Schön!

Luke Gedeon
quelle
41
Ich denke, unsere Definitionen von Schönheit unterscheiden sich etwas ..;)
Håvard Geithus
2
Genau genommen beantwortet es nicht die Frage, wie man einem einzelnen Zitat in einem einfach zitierten String entgeht ;-)
Roland Weber
Das häufigste Problem besteht darin, beim Refactoring von Code auf "Ebene n" zu gehen. Dies beantwortet diese Forderung. während die $nicht unbedingt "+ n" Kapazität hat. Ich bin mir nicht sicher, ob ich mehr testen muss. aber es sieht für mich so aus, als ob ich Code ausführen kann, der bereits in einfachen Anführungszeichen in separaten Variablen gespeichert war.
Tatsu
19

Das folgende Beispiel funktioniert, weil das maskierte einfache Anführungszeichen \'technisch zwischen zwei Argumenten in einfachen Anführungszeichen liegt

echo 'I'\''m a student'
Nick Jensen
quelle
1
Dies scheint die beste Antwort zu sein. Ich denke, es ist nicht hoch gewählt, weil es einige Jahre nach den vorherigen Antworten veröffentlicht wurde.
Abgeschieden
Viel besser als die obige Antwort und weit weniger verwirrend!
Michael Goldshteyn
auf scp gibt Fehler unerwartete EOF bei der Suche nach passenden `''
Michael Rogers