repo
Команда не может заботиться , какие цитаты он получает. Если вам нужно расширение параметров, используйте двойные кавычки. Если это означает, что вам приходится сталкиваться с большим количеством вещей, используйте большую часть одинарных кавычек, а затем вырывайтесь из них и переходите в двойные числа для той части, где вам нужно расширение.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
Объяснение следует, если вам интересно.
Когда вы запускаете команду из оболочки, эта команда получает в качестве аргументов массив строк с нулевым символом в конце. Эти строки могут содержать абсолютно любой ненулевой символ.
Но когда оболочка создает этот массив строк из командной строки, она интерпретирует некоторые символы специально; это сделано для того, чтобы упростить (возможно, сделать) команды для ввода. Например, пробелы обычно указывают границу между строками в массиве; по этой причине отдельные аргументы иногда называют «словами». Но аргумент, тем не менее, может содержать пробелы; вам просто нужен какой-то способ сказать оболочке, что вы хотите.
Вы можете использовать обратную косую черту перед любым символом (включая пробел или другую обратную косую черту), чтобы указать оболочке обрабатывать этот символ буквально. Но пока вы можете сделать что-то вроде этого:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... это может стать утомительным. Таким образом, оболочка предлагает альтернативу: кавычки. Они бывают двух основных разновидностей.
Двойные кавычки называются «группирующими кавычками». Они препятствуют расширению подстановочных знаков и псевдонимов, но в основном они включают пробелы в слове. Другие вещи, такие как расширение параметров и команд (виды, обозначенные как a $
), все еще происходят. И, конечно, если вы хотите, чтобы буквальные двойные кавычки были в двойных кавычках, вы должны использовать обратную косую черту:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Одиночные кавычки более драконовские. Все между ними воспринимается буквально, включая обратную косую черту. Нет абсолютно никакого способа получить буквальную одинарную кавычку внутри одинарных кавычек.
К счастью, кавычки в оболочке не являются разделителями слов ; сами по себе они не заканчивают слово. Вы можете входить и выходить из кавычек, в том числе между разными типами кавычек, в пределах одного и того же слова, чтобы получить желаемый результат:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
Так что это проще - намного меньше обратной косой черты, хотя последовательность «закрывающая одинарная кавычка», «обратная косая черта», буквальная одинарная кавычка, открытая одинарная кавычка требует некоторого привыкания.
Современные оболочки добавили еще один стиль цитирования, не указанный в стандарте POSIX, в котором перед одинарной кавычкой стоит начальный знак доллара. Строки так цитируемые следуют аналогичным соглашениям в строковые литералы в языке программирования ANSI C, и поэтому иногда называют «ANSI строкой» и $'
... '
пара «ANSI кавычки». Внутри таких строк приведенный выше совет о том, что обратная косая черта воспринимается буквально, больше не применяется. Вместо этого они снова становятся особенными - вы можете не только включить буквальную одинарную кавычку или обратную косую черту, добавив к ней обратную косую черту, но и оболочка также расширяет экранирование символов ANSI C (например, \n
для новой строки, \t
для табуляции и \xHH
для символа с шестнадцатеричный кодHH
). В противном случае, однако, они ведут себя как строки в одинарных кавычках: подстановка параметров или команд не происходит:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
Важно отметить, что единственная строка, полученная в качестве аргумента echo
команды , одинакова во всех этих примерах. После того, как оболочка выполнила синтаксический анализ командной строки, команда не может сказать, что и как было указано. Даже если бы захотел.
repo forall -c ' ...before... '"$variable"' ...after...'