Qual è la differenza tra $ "stringa" tra virgolette singole e $ "stringa" tra virgolette doppie in bash?


9

Stavo cercando di eseguire una nuova riga usando echoe ho provato a seguire due comandi:

  1. Primo comando:

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

    Risposta:

    Hello World
    This is a new line
  2. Secondo comando:

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

    Risposta:

    Hello World\nThis is a new line

La mia domanda è qual è la differenza tra stringa avvolta con $' 'vs stringa avvolta con $" "in bash's echo?


Nota utile: la virgoletta doppia è nota anche come virgoletta debole e la virgoletta singola è nota anche come virgoletta forte.
Rafaf Tahsin,

2
Sì, ma "weak quote"e 'strong quote'sono diversi da $'C String'e $"I18N String".
DopeGhoti,

Sei il vero MVP. : D >>> @DopeGhoti
Rafaf Tahsin,

Faccio quello che posso (:
DopeGhoti il

Risposte:


10

Come spiegato qui , la sintassi $'string'specifica una stringa in stile C che include caratteri di escape magici, come \nper una nuova riga. $"string"è per l'espansione I18N, che non ha tali fughe magiche.

Si noti che questi sono distinti dai più comuni "string"(virgolette deboli) e 'string'(virgolette forti).


9

L' $inizio della stringa in:

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

provoca l'interpretazione delle sequenze di escape.

Manuale di riferimento di Bash [dice]

Le parole del modulo $ 'stringa' sono trattate in modo speciale. La parola si espande in stringa, con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C. ..
..
Il risultato espanso è tra virgolette singole, come se il simbolo del dollaro non fosse stato presente.

Ma

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

è completamente diverso. Questo [articolo] sulla traduzione specifica per locale dice:

Una stringa tra virgolette preceduta da un simbolo di dollaro ('$') farà sì che la stringa venga tradotta in base alle impostazioni internazionali correnti. Se la locale corrente è C o POSIX, il simbolo del dollaro viene ignorato. Se la stringa viene tradotta e sostituita, la sostituzione viene racchiusa tra virgolette.


Nota: IIRC sia $'string'e $"string"potrebbe non trovare supporto tra shell diverse. Non solo le persone di altre shell li guardano con curiosità, ma discutono anche se ciò possa essere evitato per la portabilità degli script.


1
ksh93capisce anche $'...'.
Kusalananda

@Kusalananda: Hmm, buona nota :)
sjsam,

4
$'xxx'non è un bashismo, ma è stato introdotto per la prima volta da kshdiversi anni bash. Attualmente è supportato anche da zshe busybox shed è in fase di revisione da parte dello standard POSIX.
jlliagre,

@jlliagre: apprezzo il tempo :). Sono corretto ..
sjsam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.