Що означає мати в скрипті $ "доларовий знак з префіксом"?


81

Я щойно бачив це в сценарії init:

echo $"Stopping Apache"

Для чого це знак долара?

Моє дослідження поки що:

Я знайшов це в посібнику з bash:

екструдувати

Якщо встановлено, $'string'і $"string"цитування здійснюється в рамках ${parameter}розширення , укладені в подвійних лапках. Ця опція включена за замовчуванням.

... але я не знаходжу різниці між рядками з $префіксом і без нього :

$ 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

Відповіді:


111

Тут відбувається дві різні речі, зафіксовані в bashпосібнику

$ '

Одиночна котировка знака долара - це особлива форма котирування:

ANSI C Цитування

Слова форми $ 'string "обробляються спеціально. Слово розширюється до рядка, а символи, що ухиляються від косої риски, замінюються відповідно до стандарту ANSI C.

$ "

Подвійна котировка знака долара призначена для локалізації:

Локальний переклад

Рядок з подвійним котируванням, який передує знаку долара ('$'), призведе до перекладу рядка відповідно до поточного локалу. Якщо поточний локал - C або POSIX, знак долара ігнорується. Якщо рядок переведено і замінено, заміна подвійно цитується.


22

Коли рядок розширюється всередині $'', інтерпретуються послідовності відведення. На сторінці сторінки:

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.

Простим прикладом є \ n послідовність втечі для нового рядка:

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

$ 

Примітка. Ви можете отримати різні результати в інших оболонках, оскільки вони echoможуть інтерпретувати послідовності втечі, не надаючи варіанти.


8
Згаданого питання не згадується $"...".
Пітер.О

-4

Ви неправильно трактуєте посібник. Ви побачите ефект тільки коли натягнути $ -quoted знаходиться всередині в ${parameter}експансії.

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

Джерело та подальше читання: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html


6
Це не відповідає на питання: $"…"чи щось інше.
Жиль

4
Вибачте, але ваша відповідь неправильна: ${}для використання ANSI цитування не потрібно використовувати розширення. Перевірте себе:echo $'ab\ncd'
rozcietrzewiacz

1
Я думаю, що цю відповідь намагалися пояснити extquoteнеправильно, а не те, що задавали питання.
jw013

1
"${...}"відрізняється від$"..."
GypsyCosmonaut
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.