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?


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.


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.


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
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.