Одинарная кавычка в двойных кавычках и справочное руководство Bash

18

В разделе 3.1.2.3 под названием Двойные кавычки руководство Bash гласит:

Заключение символов в двойные кавычки ('"') сохраняет буквальное значение всех символов в кавычках, за исключением '$', '`', '\' и, когда расширение истории включено, '!'.

На данный момент меня интересует одиночная кавычка ( ').

Это особое значение, описанное в предыдущем разделе, раздел 3.1.2.2:

Заключение символов в одинарные кавычки ( ') сохраняет буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Объединяя две экспозиции,

 echo "'$a'"

где переменная aне определена (следовательно, $a= пустая строка), должна печататься $aна экране, так как '', имея особое значение внутри, защитит $от специальной интерпретации. Вместо этого это печатает ''. Почему так?

Lavya
источник

Ответы:

21

Символ 'одинарной кавычки в вашем echoпримере получает буквальное значение (и теряет смысл), заключенный в двойные кавычки ( "). Вложенные символы - двойные кавычки.

Что вы можете сделать, это напечатать одинарные кавычки отдельно:

echo "'"'$a'"'"

или спасаясь от $:

echo "'\$a'"
Энтон
источник
О, ты совершенно прав! Вывод соответствует вашему ответу, но я сомневаюсь, что строка «Заключение символов в двойные кавычки ('») сохраняет буквальное значение всех символов в кавычках, за исключением «$», « ’, ‘\’, and, when history expansion is enabled, ‘!’." in the manual. But now reading it again I realized the second character is not single quote, ("'") but tilde ("»). I'
Я
2
Вторым персонажем, упомянутым в руководстве, является обратный удар, а не тильда.
Кенни Эвитт
6

Вы неправильно понимаете документацию:

имея особое значение внутри, защитит $ от специальной интерпретации

«Имея свое специальное значение» означает , что это интерпретируется специально не буквально. Одиночные кавычки мешают $расширяться. Но одинарные кавычки в двойных кавычках являются буквальными символами, то есть они ни на что не влияют. Если вы хотите вывод, $aто вам нужно echo '$a'.

Хауке Лагинг
источник
вы правы. Я не только неправильно понял документ, но и неправильно прочитал (обозначая "` "для" '"!). вы правы насчет "одинарные кавычки в двойных кавычках являются буквальными символами". Благодарность!
Лавя