Jaka jest różnica między pojedynczym cytowanym „ciągiem” a podwójnym „ciągiem” w bash?

9

Próbowałem wykonać nową linię za pomocą echoi próbowałem wykonać dwa polecenia:

  1. Pierwsze polecenie:

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

    Odpowiedź:

    Hello World
    This is a new line
    
  2. Drugie polecenie:

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

    Odpowiedź:

    Hello World\nThis is a new line

Moje pytanie brzmi: jaka jest różnica między ciąg owinięte $' 'vs ciąg owinięte $" "w bash„s echo?

Rafaf Tahsin
źródło
Pomocna uwaga: Podwójny cytat jest również znany jako słabe cytowanie, a pojedynczy cytat jest również znany jako mocne cytowanie.
Rafaf Tahsin,
2
Tak, ale "weak quote"i 'strong quote'różnią się od $'C String'i $"I18N String".
DopeGhoti
Jesteś prawdziwym MVP. : D >>> @DopeGhoti
Rafaf Tahsin,
Robię, co mogę (:
DopeGhoti,

Odpowiedzi:

10

Jak wyjaśniono tutaj , składnia $'string'określa ciąg w stylu C, który zawiera znaki specjalne, takie jak \nznak nowej linii. $"string"dotyczy rozszerzenia I18N, które nie ma takich magicznych ucieczek.

Zauważ, że różnią się one od bardziej powszechnych "string"(słabe cytowanie) i 'string'(mocne cytowanie).

DopeGhoti
źródło
9

$Na początku napisu w języku:

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

powoduje interpretację sekwencji specjalnych.

Podręcznik referencyjny Bash [mówi]

Słowa w postaci $ „string” są traktowane specjalnie. Słowo jest interpretowane jako ciąg znaków, a znaki specjalne z odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C. ..
..
Rozszerzony wynik jest cytowany pojedynczo, tak jakby znak dolara nie był obecny.

Ale

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

jest zupełnie inny. W tym [artykule] na temat tłumaczeń specyficznych dla ustawień regionalnych napisano:

Ciąg cudzysłowu poprzedzony znakiem dolara („$”) spowoduje, że zostanie on przetłumaczony zgodnie z bieżącymi ustawieniami narodowymi. Jeśli bieżące ustawienia narodowe to C lub POSIX, znak dolara jest ignorowany. Jeśli ciąg zostanie przetłumaczony i zastąpiony, zamiennik zostanie podany w cudzysłów.


Uwaga: IIRC zarówno $'string'i $"string"może nie znaleźć wsparcia dla różnych powłok. Ludzie z innych powłok przyglądają się im nie tylko z ciekawością, ale także zastanawiają się, czy można tego uniknąć w celu przenoszenia skryptów.

sjsam
źródło
1
ksh93również rozumie $'...'.
Kusalananda
@Kusalananda: Hmm, dobra uwaga :)
sjsam
4
$'xxx'nie jest baszizmem, ale po raz pierwszy został wprowadzony kshkilka lat wcześniej bash. Obecnie jest również wspierany przez zsha busybox shi jest w trakcie sprawdzania przez standard POSIX.
jlliagre
@jlliagre: Doceń czas :). Stoję skorygowany ..
sjsam 18.08.16