Was bedeutet es, in einem Skript eine Zeichenfolge mit dem Präfix $ "dollarsign" zu haben?


81

Ich habe das gerade in einem Init-Skript gesehen:

echo $"Stopping Apache"

Wofür ist das Dollarzeichen?

Meine bisherigen Forschungen:

Ich fand das im Bash-Handbuch:

extquote

Wenn gesetzt, $'string'und $"string"unter Angabe innerhalb ausgeführt ${parameter}in Anführungszeichen Erweiterungen. Diese Option ist standardmäßig aktiviert.

... aber ich finde keinen Unterschied zwischen Strings mit und ohne $Präfix:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD

Antworten:


111

Hier laufen zwei verschiedene Dinge ab, die beide im bashHandbuch dokumentiert sind

$ '

Ein einfaches Anführungszeichen mit Dollarzeichen ist eine spezielle Form der Anführungszeichen:

ANSI C-Zitat

Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu einer Zeichenfolge erweitert, wobei mit einem Backslash versehene Zeichen gemäß dem ANSI C-Standard ersetzt werden.

$ "

Das doppelte Anführungszeichen mit dem Dollarzeichen gilt für die Lokalisierung:

Übersetzung des Gebietsschemas

Eine Zeichenfolge in doppelten Anführungszeichen mit vorangestelltem Dollarzeichen ('$') bewirkt, dass die Zeichenfolge entsprechend dem aktuellen Gebietsschema übersetzt wird. Wenn das aktuelle Gebietsschema C oder POSIX ist, wird das Dollarzeichen ignoriert. Wenn die Zeichenfolge übersetzt und ersetzt wird, wird die Ersetzung in doppelte Anführungszeichen gesetzt.


22

Wenn eine Zeichenfolge innerhalb von erweitert wird $'', werden die Escape-Sequenzen interpretiert. Aus der Manpage:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

Ein einfaches Beispiel ist die Escape-Sequenz für eine neue Zeile:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

Hinweis: In anderen Shells erhalten Sie möglicherweise andere Ergebnisse als echobei der Interpretation von Escape-Sequenzen, ohne dass Optionen angegeben werden.


8
Es gibt keine Erwähnung von $"..."gemäß der Frage.
Peter.O

-4

Sie interpretieren das Handbuch falsch. Sie werden nur dann einen Effekt sehen, wenn sich eine Zeichenfolge mit Anführungszeichen in einer ${parameter}Erweiterung befindet.

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

Quelle und weiterführende Literatur: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html


6
Dies beantwortet nicht die Frage: $"…"ist etwas anderes.
Gilles

4
Entschuldigung, aber Ihre Antwort ist falsch: Es ist nicht erforderlich, eine ${}Erweiterung zu verwenden, um ANSI-Anführungszeichen zu verwenden. echo $'ab\ncd'
Überzeugen

1
Ich denke, diese Antwort versuchte, extquotefalsch zu erklären, anstatt was die Frage stellte.
JW013

1
"${...}"ist anders als$"..."
GypsyCosmonaut
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.