Это очень зависит от оболочки. Проверьте руководство вашей оболочки для деталей.
Также обратите внимание, что некоторые символы являются особенными только в некоторых контекстах. Например, в большинстве оболочек, *
и ?
специальные только в списке контекстов, в POSIX или CSH-подобных оболочек, ~
является особенным только в начале слова или после некоторых символов , как :
. То же самое для =
в zsh
. В некоторых оболочках [
это особенное значение только при условии соответствия (с некоторыми ограничениями) a ]
.
В некоторых оболочках, таких как bash
или yash
, специальные символы, такие как пустые разделители токенов, также различаются в зависимости от локали.
Операторы цитирования (для удаления особого значения этих символов) также сильно различаются между оболочками.
Борновоподобные раковины
Сводка по Bourne-подобным оболочкам (это оболочки, которые, как известно, вызывались sh
в той или иной системе с 80-х годов):
Оболочка Борна
Специальные символы:
"\'&|;()^`<>$
, пробел, перевод строки и табуляция являются специальными в простых командных строках, когда они не заключены в кавычки.
#
(кроме ранней версии) является специальным в начале строки или после пробела без кавычек, табуляции или &|()^<>;`
.
{
и }
отличаются только тем, что они являются ключевыми словами оболочки (так что только слова в командной позиции).
*?[
являются особыми в качестве операторов глобирования, поэтому только в контексте списка. В случае [
, это то, [...]
что является оператором смещения, [
или ]
нужно или только нужно заключить в кавычки, чтобы удалить специальное значение.
=
особенный, когда он используется как оператор присваивания. То есть в простой команде для всех слов, которые не следуют за аргументом (кроме как после set -k
).
Цитирование операторов
\
\<newline>
заключает в кавычки все специальные символы, кроме новой строки ( это способ продолжить длинную логическую строку на следующей физической строке, чтобы удалить последовательность). Обратите внимание, что обратные пометки добавляют дополнительную сложность, поскольку внутри них \
используются в первую очередь, чтобы избежать закрывающего обратного удара и помочь парсеру. Внутри двойных кавычек \
может использоваться только для экранирования "
, $
и `
( \<newline>
все еще является продолжением строки). Внутри документа здесь то же самое, за исключением "
. \
это единственный способ избежать символов внутри здесь документов.
"..."
двойные кавычки экранируют все символы, кроме себя \
, $
и `
.
'...'
одинарные кавычки экранируют все символы, кроме себя.
POSIX снаряды
Оболочки POSIX ведут себя в основном как оболочка Борна, за исключением того, что:
ksh
как POSIX за исключением того, что:
{string}
является особенным, если строка содержит кавычки ,
(или ..
в некоторых случаях и с некоторыми версиями).
- В ksh93 есть дополнительный специальный оператор цитирования:
$'...'
со сложными правилами. Этот оператор также найден (с некоторыми вариациями) в bash
, zsh
, mksh
и FreeBSD и BusyBox sh
.
ksh93
также есть $"..."
оператор цитирования, который работает аналогично, "..."
за исключением того, что строка подлежит локализации (может быть настроена так, что она переводит на язык пользователя). mksh
игнорирует $
в $"..."
.
bash
нравится, ksh93
но:
- в однобайтовых локалях символов все пустые (в соответствии с локалью) символы рассматриваются как разделители (например, пробел или табуляция). По сути, это означает, что вы должны заключать в кавычки все байты с 8-м битом, установленным на случай, если они могут быть пустым символом в некоторой локали.
- Когда расширение истории csh включено, как в интерактивных экземплярах, оно
!
является особенным в некоторых контекстах, и двойные кавычки не всегда избегают его. И ^
особенно в начале команды.
zsh
нравится, ksh93
но:
- то же самое, что и
bash
для расширения истории csh
=
является особенным в качестве первого символа слова ( =ls
расширяется до /bin/ls
).
{
а }
также может открывать и закрывать группы команд, когда они не разделены (как в {echo text}
работах, подобных тем, что у Борна { echo text;}
).
- за исключением
[
одного, [
потребности цитируются, даже если они не закрыты ]
.
- С
extendedglob
включенной опцией #
, ^
и ~
операторы globbing.
- С
braceccl
опцией, {non-empty-string}
это особенное.
$"..."
не поддерживается.
- как особая причуда,
?
не является особой, когда следует за %
(даже в кавычках или расширенной) в начале слова (чтобы позволить %?name
задание)
rcquotes
вариант (не включена по умолчанию) позволяет ввести одиночные кавычки как ''
внутри одиночных кавычек а ля rc
(см . ниже)
yash
как POSIX
кроме этого.
- все пустые символы считаются разделителями.
- С помощью
brace-expand
опции реализует расширение скобки в стиле zsh.
Для всех оболочек существуют особые контексты, в которых цитирование работает по-разному. Мы уже упоминали здесь документы и обратные ссылки, но есть также [[...]]
в ksh и нескольких других оболочках, POSIX $((...))
, case
конструкциях ...
Также обратите внимание, что цитирование может иметь другие побочные эффекты, когда речь идет о расширениях (с двойными кавычками) или при применении к разделителям документов. Это также отключает зарезервированные слова и влияет на расширение псевдонима.
Резюме
В Bourne-подобных оболочках !#$^&*?[(){}<>~;'"`\|=
SPC, TAB, NEWLINE и некоторые байты с установленным 8-м битом являются или могут быть специальными (по крайней мере, в некоторых контекстах).
Чтобы убрать особое значение, чтобы к ним относились буквально, используйте цитаты.
Использование:
'...'
удалить особое значение каждого символа:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
удалить специальное значение только одного символа:
printf '<%s>\n' foo bar\ baz #comment
Выше только символ пробела, которому предшествует a \
, передается буквально printf
. Другие обрабатываются оболочкой как разделители токенов.
- использовать
"..."
процитировать символы в то же время позволяя расширение параметров ( $var
, $#
, ${foo#bar}
...), арифметическая разложение ( $((1+1))
также $[1+1]
в некоторых оболочках) и подстановки команд ( $(...)
или старой форме `...`
. На самом деле, большую часть времени, вы хотите поместить эти расширения внутри двойные кавычки в любом случае . Вы можете использовать \
внутри, "..."
чтобы удалить специальное значение символов, которые все еще особенные (но только их).
если строка содержит '
символ, вы все равно можете использовать '...'
для остальных и использовать другие механизмы цитирования, которые могут заключать в кавычки '
как "'"
или \'
или (где доступно) $'\''
:
echo 'This is "tricky", isn'\''t it?'
Используйте современную $(...)
форму подстановки команд. Используйте старый только `...`
для совместимости с оболочкой Bourne, то есть для очень старой системы, и только в назначениях переменных, как в not use:
echo "`echo "foo bar"`"
Что не будет работать с оболочкой Bourne или AT & T версиями ksh. Или:
echo "`echo \"foo bar\"`"
Который будет работать с Bourne и AT & T ksh, но не с yash
, а использовать:
var=`echo "foo bar"`; echo "$var"
который будет работать со всеми.
Вложение их переносимо с двойными кавычками также невозможно, поэтому снова используйте переменные. Также остерегайтесь специальной обработки обратной косой черты:
var=`printf '%s\n' '\\'`
Будет хранить только одну обратную косую черту внутри $var
, потому что есть дополнительный уровень обработки обратной косой черты (для \
, `и $
(а также "
когда они заключены в кавычки, кроме как в yash
)) внутри обратных кавычек, поэтому вам нужно либо
var=`printf '%s\n' '\\\\'`
или
var=`printf '%s\n' '\\\'
вместо.
Csh семья
csh и tcsh имеют существенно различный синтаксис, хотя с оболочкой Bourne все еще много общего, поскольку они имеют общее наследие.
Специальные символы:
"\'&|;()^`<>$
, пробел, перевод строки и табуляция являются специальными везде, когда они не указаны.
#
(csh - это оболочка, представленная #
в качестве лидера комментария), особенная в начале скрипта или после пробела без кавычек, табуляции или новой строки.
*?[
являются особенными, как операторы globbing, так и в контексте списка
{non-empty-string}
является особенным (csh - оболочка, которая ввела расширение скобки).
!
и ^
являются особенными как часть расширения истории (опять же, изобретение csh), а правила цитирования особенные.
~
(расширение тильды также изобретение csh) особенное в некоторых контекстах.
Цитирование операторов
Они такие же, как для оболочки Bourne, но поведение отличается. tcsh ведет себя как csh с точки зрения синтаксиса, вы обнаружите, что многие версии csh имеют неприятные ошибки. Получите последнюю версию tcsh, чтобы получить примерно рабочую версию csh.
\
экранирует один символ, кроме новой строки (так же, как и для оболочки Bourne). Это единственный оператор цитирования, который может сбежать !
. \<newline>
не избегает этого, но преобразует его из разделителя команд в разделитель токенов (например, пробел)
"..."
ускользает все символы , кроме самого, $
, `
, новой строки и !
. В отличие от оболочки Bourne, вы не можете использовать \
для побега $
и `
изнутри "..."
, но вы можете использовать \
для выхода !
или перехода на новую строку (но не на себя, кроме как перед !
символом a или переводом строки). Литерал !
есть, "\!"
а литерал \!
есть "\\!"
.
'...'
экранирует все символы кроме себя !
и перевода строки. Как для двойных кавычек, так !
и перевод строки может быть экранирован обратной косой чертой.
- Подстановка команд производится только через
`...`
синтаксис и вряд ли может использоваться надежно.
- Подстановка переменных также довольно плохо спроектирована и подвержена ошибкам.
$var:q
Оператор помогает писать более надежные коду с участием переменных.
Резюме
Держитесь подальше от csh, если можете. Если вы не можете использовать:
- одинарные кавычки, чтобы процитировать большинство символов.
!
а новая строка еще нужна \
.
\
может избежать большинства персонажей
"..."
Можно разрешить некоторые расширения внутри него, но это довольно глючно, если они включают символы новой строки и / или обратной косой черты, лучше всего использовать только одинарные кавычки и $var:q
для расширения переменных. Вам нужно будет использовать циклы, если вы хотите надежно объединить элементы массива.
rc
семья
rc
это plan9
оболочка , и как его потомки es
и akanga
была перенесена на Unix и Unix-подобные. Это оболочка с намного более чистым и лучшим синтаксисом, которую каждый использовал бы, если бы мы не были привязаны к оболочкам типа Борна для обратной совместимости.
rc
/akanga
Специальные символы
#;&|^$=`'{}()<>
, SPC, TAB и NEWLINE всегда особенные, если они не указаны.
*?[
работают операторы.
Оператор цитирования
'...'
является единственным оператором цитирования. Буква '
написана ''
в одинарных кавычках, как в:
echo 'it''s so simple isn''t it?'
es
es
можно рассматривать как экспериментальную оболочку на основе rc
.
Хотя есть несколько отличий. Интересным для этого Q / A является то, что \
он также является оператором кавычек ( который заключает в кавычки все специальные символы, кроме новой строки) и может также использоваться для введения escape-последовательностей, таких как \n
для новой строки, \b
для обратной косой черты ...
рыбы
Рыба является относительным новичком (около 2005 г.), в первую очередь предназначена для интерактивного использования, а также имеет существенно отличающийся синтаксис от других оболочек.
специальные символы
"'\()$%{}^<>;&|
всегда особенный, если не указан (обратите внимание на %
(для расширения pid), как на значительное отличие от других оболочек, и `
не является особенным)
#
(комментарий) особенный при переходе без кавычек, табуляции, новой строки или ;&|^<>
*?
(но не [...]
) операторы
Цитирование операторов
\
заключает в кавычки один специальный символ, кроме новой строки, но имейте в виду, что он также используется как вводная последовательность C ( \n
, \b
...). Я \n
не цитируемый, n
а перевод строки.
"..."
цитирует все, кроме себя, $
и обратный слеш и обратный слеш могут быть использованы, чтобы избежать их. \<newline>
продолжение строки (удалено) внутри "..."
.
'...'
цитирует все, кроме себя и \
, и вы можете использовать обратную косую черту, чтобы избежать тех.
=
,@
И%
специальные в некоторых оболочках в некоторых контекстах.