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.
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 --versionGNU 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.
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
3.1.2.2 Single Quotes
su -c '/etc/init.d/myservice start' -l myuser
(von root geführt)Antworten:
echo 'I\'m a student'
funktioniert nicht. Aber folgendes funktioniert:
echo $'I\'m a student'
Aus der Manpage von bash:
quelle
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.$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
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
I
sofort 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!
quelle
$
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.Das folgende Beispiel funktioniert, weil das maskierte einfache Anführungszeichen
\'
technisch zwischen zwei Argumenten in einfachen Anführungszeichen liegtecho 'I'\''m a student'
quelle