Яка різниця між одиничним котируванням $ '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'задає рядок у стилі С, який включає символи магії, що уникнули, наприклад, \nдля нового рядка. $"string"- це розширення I18N, яке не має таких чарівних втеч.

Зауважте, що вони відрізняються від більш поширених "string"(слабке котирування) та 'string'(сильне цитування).


9

На $початку рядка в:

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

викликає інтерпретацію послідовностей втечі.

Довідковий посібник Баша [каже]

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

Але

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

зовсім інше. Ця [стаття] про конкретний переклад мови говорить:

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


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


1
ksh93також розуміє $'...'.
Kusalananda

@Kusalananda: Хм, хороша примітка :)
sjsam

4
$'xxx'не є башизмом, але вперше був введений за kshкілька років до bashцього. В даний час вона також підтримується zshі busybox shі знаходиться на розгляді в стандарті POSIX.
jlliagre

@jlliagre: Цінуй час :). Я
виправданий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.