Работая в оболочке (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"'
(Я знаю, что на это можно легко ответить, просто попробовав, это будет разумное исследование. Я решил приложить эти усилия к ответу вики сообщества ниже).
-
Есть ли исключения, причуды, сюрпризы?
(Обратите внимание, что вики-ответ сообщества есть ниже. Вместо того, чтобы добавлять отдельный ответ с другим исключением или причудой, рассмотрите возможность добавления в сообщество вики).