Работая в оболочке (Unix), иногда мне нужно заключать в двойные кавычки или наоборот, то есть писать что-то вроде "foo 'bar baz' moo" или 'foo "bar baz" moo' . Это может быть потому, что
- результирующая строка будет проанализирована снова (как с
eval, с оболочкой, запущеннойwatch, с оболочкой, запущеннойsshdна некотором удаленном сервере и т. д.), и эти внутренние кавычки имеют решающее значение для различения реальных аргументов во время этого второго анализа; - или мне просто нужен исходный аргумент для включения кавычек по любой другой причине.
Некоторая двусмысленность появляется, когда вместо bar baz меня есть переменная, скажем, $variable . Вот что говорит POSIX:
2.2.2. Одиночные кавычки
Заключение символов в одинарные кавычки (
'') должно сохранять буквальное значение каждого символа в одинарных кавычках. Одиночная кавычка не может встречаться в одинарных кавычках.2.2.3 Двойные кавычки
Заключение символов в двойные кавычки (
"") должно сохранять буквальное значение всех символов в двойных кавычках, за исключением символов обратной кавычки, <знак доллара> и <обратный слэш>, следующим образом:
$
Они сохранят свое особое значение, представляя расширение параметров […], форму подстановки команд […] и арифметическое расширение […].[...]
Не совсем очевидно, какое правило применяется для $variable внутри одинарных кавычек внутри двойных кавычек (или внутри двойных кавычек внутри одинарных кавычек), поэтому я спрашиваю:
Какое правило относится к:
-
variable=123 echo "'$variable'" -
variable=123 echo '"$variable"'
(Я знаю, что на это можно легко ответить, просто попробовав, это будет разумное исследование. Я решил приложить эти усилия к ответу вики сообщества ниже).
-
Есть ли исключения, причуды, сюрпризы?
(Обратите внимание, что вики-ответ сообщества есть ниже. Вместо того, чтобы добавлять отдельный ответ с другим исключением или причудой, рассмотрите возможность добавления в сообщество вики).
