В чем разница между одинарными кавычками $ 'string' и двойными кавычками $ 'string' в bash?


9

Я пытался выполнить новую строку, используя echoи попытался следующие две команды:

  1. Первая команда:

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

    Отклик:

    Hello World
    This is a new line
  2. Вторая команда:

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

    Отклик:

    Hello World\nThis is a new line

Мой вопрос: в чем разница между строкой, обернутой $' 'строкой, и строкой, обернутой $" "в bash's echo?


Полезное примечание: двойная кавычка также называется слабой кавычкой, а одинарная кавычка также называется сильной кавычкой.
Рафаф Тахсин

2
Да, но "weak quote"и 'strong quote'отличаются от $'C String'и $"I18N String".
DopeGhoti

Вы настоящий MVP. : D >>> @ DopeGhoti
Рафаф Тахсин

Я делаю то, что могу (:
DopeGhoti

Ответы:


10

Как объяснено здесь , синтаксис $'string'определяет строку в стиле C, которая включает магические экранированные символы, например, \nдля новой строки. $"string"предназначен для расширения I18N, у которого нет таких волшебных побегов.

Обратите внимание, что они отличаются от более распространенных "string"(слабое цитирование) и 'string'(сильное цитирование).


9

В $начале строки в:

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

заставляет escape-последовательности интерпретироваться.

Справочник Bash [говорит]

Слова вида $ 'string' обрабатываются специально. Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C. ..
..
Расширенный результат заключен в одинарные кавычки, как если бы знак доллара отсутствовал.

Но

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

совершенно другой. Эта [статья] о переводе на конкретный язык говорит:

Строка в двойных кавычках, перед которой стоит знак доллара ('$'), приведет к переводу строки в соответствии с текущей локалью. Если текущим языковым стандартом является C или POSIX, знак доллара игнорируется. Если строка переведена и заменена, замена заменяется двойными кавычками.


Примечание: IIRC оба $'string'и $"string"могут не найти поддержки среди разных оболочек. Не только люди из других оболочек с любопытством смотрят на них, но и спорят о том, можно ли этого избежать из-за переносимости сценариев.


1
ksh93тоже понимает $'...'.
Кусалананда

@Kusalananda: Хм, хорошая заметка :)
sjsam

4
$'xxx'это не башизм, но впервые был введен kshнесколькими годами ранее bash. В настоящее время она также поддерживается zshи busybox shи находится на рассмотрении в стандарте POSIX.
Jlliagre

@jlliagre: Цените время :). Я исправлен ..
sjsam
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.