Что значит иметь в скрипте строку с префиксом $ Dollign?

81

Я только что видел это в сценарии инициализации:

echo $"Stopping Apache"

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

Мои исследования до сих пор:

Я нашел это в руководстве по bash:

extquote

Если установлено, $'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, знак доллара игнорируется. Если строка переведена и заменена, замена заменяется двойными кавычками.

jw013
источник
22

Когда строка раскрывается внутри $'', escape-последовательности интерпретируются. Из справочной страницы:

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.

Простой пример - escape-последовательность \ n для новой строки:

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

$ 

Примечание: вы можете получить другие результаты в других оболочках, так как вы echoможете интерпретировать escape-последовательности без предоставления опций.

jordanm
источник
8
Там нет упоминания о $"...", в соответствии с вопросом.
Peter.O
-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