Was ist der Unterschied zwischen einfach '$ string' in einfachen Anführungszeichen und $ "string" in doppelten Anführungszeichen in bash?

9

Ich habe versucht, eine neue Zeile mit den echofolgenden zwei Befehlen auszuführen:

  1. Erster Befehl:

    echo $'Hello World\nThis is a new line'

    Antwort:

    Hello World
    This is a new line
    
  2. Zweiter Befehl:

    echo $"Hello World\nThis is a new line"

    Antwort:

    Hello World\nThis is a new line

Meine Frage ist , was ist der Unterschied zwischen Schnur umwickelt mit $' 'vs Schnur umwickelt mit $" "in bash‚s echo?

Rafaf Tahsin
quelle
Nützlicher Hinweis: Doppelte Anführungszeichen werden auch als schwache Anführungszeichen und einfache Anführungszeichen auch als starke Anführungszeichen bezeichnet.
Rafaf Tahsin
2
Ja, aber "weak quote"und 'strong quote'unterscheiden sich von $'C String'und $"I18N String".
DopeGhoti
Du bist der echte MVP. : D >>> @DopeGhoti
Rafaf Tahsin
Ich tue was ich kann (:
DopeGhoti

Antworten:

10

Wie hier erläutert , gibt die Syntax $'string'eine Zeichenfolge im C-Stil an, die magisch \nmaskierte Zeichen enthält, z. B. für eine neue Zeile. $"string"ist für die I18N-Erweiterung, der keine solche Magie entgeht.

Beachten Sie, dass sich diese von den häufigeren "string"(schwaches Zitat) und 'string'(starkes Zitat) unterscheiden.

DopeGhoti
quelle
9

Das $am Anfang des Strings in:

echo $'Hello World\nThis is a new line'

bewirkt, dass Escape-Sequenzen interpretiert werden.

Bash Referenzhandbuch [sagt]

Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert, wobei Zeichen mit umgekehrten Schrägstrichen ersetzt werden, wie im ANSI C-Standard angegeben. ..
..
Das erweiterte Ergebnis wird in einfache Anführungszeichen gesetzt, als ob das Dollarzeichen nicht vorhanden gewesen wäre.

Aber

echo $"Hello World\nThis is a new line"

ist ganz anders. In diesem [Artikel] zur länderspezifischen Übersetzung heißt es:

Eine Zeichenfolge in doppelten Anführungszeichen, der ein Dollarzeichen ('$') vorangestellt ist, bewirkt, dass die Zeichenfolge gemäß 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.


Hinweis: IIRC beide $'string'und $"string"möglicherweise keine Unterstützung zwischen verschiedenen Schalen. Menschen aus anderen Shells sehen sie nicht nur neugierig an, sondern diskutieren auch darüber, ob dies aus Gründen der Skriptportabilität vermieden werden könnte.

sjsam
quelle
1
ksh93versteht auch $'...'.
Kusalananda
@Kusalananda: Hmm, gute Nachricht :)
sjsam
4
$'xxx'ist kein Bashismus, wurde aber erst ksheinige Jahre zuvor eingeführt bash. Es wird derzeit auch vom POSIX-Standard unterstützt zshund wird derzeit busybox shgeprüft.
Jlliagre
@jlliagre: Schätzen Sie die Zeit :). Ich stehe korrigiert ..
sjsam