Che cosa vuol dire avere una "stringa con il segno di dollari" in uno script?


81

Ho appena visto questo in uno script di init:

echo $"Stopping Apache"

A cosa serve quel simbolo di dollaro?

La mia ricerca finora:

Ho trovato questo nel manuale di bash:

extquote

Se impostata, $'string'e $"string"citando viene eseguita entro ${parameter}espansioni racchiuse tra virgolette. Questa opzione è abilitata per impostazione predefinita.

... ma non trovo alcuna differenza tra le stringhe con e senza il $prefisso:

$ 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

Risposte:


111

Qui ci sono due cose diverse, entrambe documentate nel bashmanuale

$'

La virgoletta singola con simbolo del dollaro è una forma speciale di citazione:

Citazioni ANSI C.

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.

$"

La doppia virgoletta con simbolo del dollaro è per la localizzazione:

Traduzione locale

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.


22

Quando una stringa viene espansa all'interno di $'', vengono interpretate le sequenze di escape. Dalla 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.

Un semplice esempio è la sequenza di escape \ n per una nuova riga:

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

$ 

Nota: è possibile ottenere risultati diversi in altre shell in quanto echointerpretare le sequenze di escape senza fornire opzioni.


8
Non si fa menzione di $"...", secondo la domanda.
Peter,

-4

Stai interpretando male il manuale. Vedrete effetto solo quando una stringa $ -quoted è all'interno di ${parameter}un'espansione.

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

Fonte e ulteriori letture: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html


6
Questo non risponde alla domanda: $"…"è qualcosa di diverso.
Gilles,

4
Ci dispiace, ma la tua risposta è sbagliata: non è necessario utilizzare l' ${}espansione per utilizzare la quotazione ANSI. Controlla tu stesso:echo $'ab\ncd'
rozcietrzewiacz,

1
Penso che questa risposta stia cercando di spiegare in extquotemodo errato invece di quello che la domanda stava ponendo.
jw013,

1
"${...}"è diverso da$"..."
GypsyCosmonaut il
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.