Многие вопросы, например, «Как ввести символ двойной кавычки (»)? нас спрашивают, и мы не хотим загромождать наше сообщество одним и тем же ответом (введите его, как
\"
будто он не заключен в'
s,"
если заключен в'
s.) Итак, вопрос здесь.
Вы не можете вводить специальные символы в терминал, как обычные, например, эта команда не будет выполнена:
echo Updates (11)
Итак, как ввести эти символы в терминале, как если бы они были нормальными?
!#$^&*?[](){}<>~;'"\|<space><tab><newline>
=
,@
И%
специальные в некоторых оболочках в некоторых контекстах.^M
(^J
) для меня действует как перевод строки ( ) (Ubuntu 14.04, sh).^M
во^J
входной, но^M
не является специальным для оболочки и не нуждается в кавычках. Напечатайте,echo ^V^M | hd
и вы увидите символ 0d (и 0a, добавленный echo).hd
, может бытьxxd
, лучше, как шестнадцатеричный зритель.od -tx1
илиsed -n l
vx's xxd, если у вас его нетhd
. Некоторые системы также имеютcat -vte
илиcat -A
Ответы:
Это очень зависит от оболочки. Проверьте руководство вашей оболочки для деталей.
Также обратите внимание, что некоторые символы являются особенными только в некоторых контекстах. Например, в большинстве оболочек,
*
и?
специальные только в списке контекстов, в POSIX или CSH-подобных оболочек,~
является особенным только в начале слова или после некоторых символов , как:
. То же самое для=
вzsh
. В некоторых оболочках[
это особенное значение только при условии соответствия (с некоторыми ограничениями) a]
.В некоторых оболочках, таких как
bash
илиyash
, специальные символы, такие как пустые разделители токенов, также различаются в зависимости от локали.Операторы цитирования (для удаления особого значения этих символов) также сильно различаются между оболочками.
Борновоподобные раковины
Сводка по Bourne-подобным оболочкам (это оболочки, которые, как известно, вызывались
sh
в той или иной системе с 80-х годов):Оболочка Борна
Специальные символы:
"\'&|;()^`<>$
, пробел, перевод строки и табуляция являются специальными в простых командных строках, когда они не заключены в кавычки.#
(кроме ранней версии) является специальным в начале строки или после пробела без кавычек, табуляции или&|()^<>;`
.{
и}
отличаются только тем, что они являются ключевыми словами оболочки (так что только слова в командной позиции).*?[
являются особыми в качестве операторов глобирования, поэтому только в контексте списка. В случае[
, это то,[...]
что является оператором смещения,[
или]
нужно или только нужно заключить в кавычки, чтобы удалить специальное значение.=
особенный, когда он используется как оператор присваивания. То есть в простой команде для всех слов, которые не следуют за аргументом (кроме как послеset -k
).Цитирование операторов
\
\<newline>
заключает в кавычки все специальные символы, кроме новой строки ( это способ продолжить длинную логическую строку на следующей физической строке, чтобы удалить последовательность). Обратите внимание, что обратные пометки добавляют дополнительную сложность, поскольку внутри них\
используются в первую очередь, чтобы избежать закрывающего обратного удара и помочь парсеру. Внутри двойных кавычек\
может использоваться только для экранирования"
,$
и`
(\<newline>
все еще является продолжением строки). Внутри документа здесь то же самое, за исключением"
.\
это единственный способ избежать символов внутри здесь документов."..."
двойные кавычки экранируют все символы, кроме себя\
,$
и`
.'...'
одинарные кавычки экранируют все символы, кроме себя.POSIX снаряды
Оболочки POSIX ведут себя в основном как оболочка Борна, за исключением того, что:
^
больше не является специальным персонажем~
является особенным в некоторых контекстах{
разрешено быть особенным, поэтому следует указать.ksh
как POSIX за исключением того, что:
{string}
является особенным, если строка содержит кавычки,
(или..
в некоторых случаях и с некоторыми версиями).$'...'
со сложными правилами. Этот оператор также найден (с некоторыми вариациями) вbash
,zsh
,mksh
и FreeBSD и BusyBoxsh
.ksh93
также есть$"..."
оператор цитирования, который работает аналогично,"..."
за исключением того, что строка подлежит локализации (может быть настроена так, что она переводит на язык пользователя).mksh
игнорирует$
в$"..."
.bash
нравится,
ksh93
но:!
является особенным в некоторых контекстах, и двойные кавычки не всегда избегают его. И^
особенно в начале команды.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-м битом являются или могут быть специальными (по крайней мере, в некоторых контекстах).Чтобы убрать особое значение, чтобы к ним относились буквально, используйте цитаты.
Использование:
'...'
удалить особое значение каждого символа:\
удалить специальное значение только одного символа:Выше только символ пробела, которому предшествует a
\
, передается буквальноprintf
. Другие обрабатываются оболочкой как разделители токенов."..."
процитировать символы в то же время позволяя расширение параметров ($var
,$#
,${foo#bar}
...), арифметическая разложение ($((1+1))
также$[1+1]
в некоторых оболочках) и подстановки команд ($(...)
или старой форме`...`
. На самом деле, большую часть времени, вы хотите поместить эти расширения внутри двойные кавычки в любом случае . Вы можете использовать\
внутри,"..."
чтобы удалить специальное значение символов, которые все еще особенные (но только их).если строка содержит
'
символ, вы все равно можете использовать'...'
для остальных и использовать другие механизмы цитирования, которые могут заключать в кавычки'
как"'"
или\'
или (где доступно)$'\''
:Используйте современную
$(...)
форму подстановки команд. Используйте старый только`...`
для совместимости с оболочкой Bourne, то есть для очень старой системы, и только в назначениях переменных, как в not use:Что не будет работать с оболочкой Bourne или AT & T версиями ksh. Или:
Который будет работать с Bourne и AT & T ksh, но не с
yash
, а использовать:который будет работать со всеми.
Вложение их переносимо с двойными кавычками также невозможно, поэтому снова используйте переменные. Также остерегайтесь специальной обработки обратной косой черты:
Будет хранить только одну обратную косую черту внутри
$var
, потому что есть дополнительный уровень обработки обратной косой черты (для\
, `и$
(а также"
когда они заключены в кавычки, кроме как вyash
)) внутри обратных кавычек, поэтому вам нужно либоили
вместо.
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 всегда особенные, если они не указаны.*?[
работают операторы.Оператор цитирования
'...'
является единственным оператором цитирования. Буква'
написана''
в одинарных кавычках, как в:es
es
можно рассматривать как экспериментальную оболочку на основеrc
.Хотя есть несколько отличий. Интересным для этого Q / A является то, что
\
он также является оператором кавычек ( который заключает в кавычки все специальные символы, кроме новой строки) и может также использоваться для введения escape-последовательностей, таких как\n
для новой строки,\b
для обратной косой черты ...рыбы
Рыба является относительным новичком (около 2005 г.), в первую очередь предназначена для интерактивного использования, а также имеет существенно отличающийся синтаксис от других оболочек.
специальные символы
"'\()$%{}^<>;&|
всегда особенный, если не указан (обратите внимание на%
(для расширения pid), как на значительное отличие от других оболочек, и`
не является особенным)#
(комментарий) особенный при переходе без кавычек, табуляции, новой строки или;&|^<>
*?
(но не[...]
) операторыЦитирование операторов
\
заключает в кавычки один специальный символ, кроме новой строки, но имейте в виду, что он также используется как вводная последовательность C (\n
,\b
...). Я\n
не цитируемый,n
а перевод строки."..."
цитирует все, кроме себя,$
и обратный слеш и обратный слеш могут быть использованы, чтобы избежать их.\<newline>
продолжение строки (удалено) внутри"..."
.'...'
цитирует все, кроме себя и\
, и вы можете использовать обратную косую черту, чтобы избежать тех.источник
c
действует так же , как\c
,c
не выходаc: command not found
на STDERR и т.д.) И я говорю оsh
здесь. Кроме того, помните, что это вопрос «зачистки», т. Е. Он предназначен для того, чтобы охватить всех таких персонажей, поэтому не нужно задавать 19+ вопросов. Вопрос был опубликован благодаря инциденту, когда разные персонажи задавали разные вопросы, и мы, конечно же, хотим привести его в порядок!?[
это операторы-сабли, но они не особенные во всех контекстах, но,*
похоже , таковы , потому чтоecho *
плохоecho
отражают содержимое текущего каталога (ничего не избегая).echo ?
повторяет буквальное?
иecho [
повторяет буквальное[
. Кроме того, также]
является глобатором.*
поскольку глобус распространяется на все не скрытые файлы,?
на не скрытые односимвольные файлы,[a-z]
на файлы, имя которых состоит из одного символа между a и z и так далее. Когда они не совпадают ни с одним файлом (как в вашем случае для?
), в зависимости от оболочки вы получаете ошибку несоответствия или шаблон расширяется до самого себя. В любом случае, даже в оболочке, где они расширяются, они должны заключаться в кавычки в случае, если они могут соответствовать файлу.*
все еще расширяется к чему-то.*
похоже?
, если он не совпадает (для случая*
одного, то есть, когда в текущем каталоге есть только скрытые файлы, потомуa*
что там, где нет файла, имя которого начинается сa
...), он либо расширяется до сама по себе ( в большинстве Bourne-подобных оболочек), или выдает ошибку нет матчей (csh
,tcsh
,fish
(предупреждение),zsh
,bash -O failglob
, ранние Unix оболочки), (или ничего не содержит, с возможностью nullglob некоторых оболочек или , если есть еще один шаблон , который расширяется в что-то в csh, tcsh, zsh -o cshnullglob, ранние оболочки unix).1. Побег
Удалите все эти символы с помощью символа
\
, как это (не работает с символами перевода строки / возврата каретки):2. Двойная кавычка
Заключите весь текст в
"
s, вот так:3. Одиночная кавычка
То же, что двойная кавычка, но специального токена нет.
источник
fish
оболочки, а не оболочек типа Борна, где одинарные кавычки указывают каждый символ (обратный слеш не является особенным внутри'...'
). Обратите внимание, что вfish
,%
также является специальным символом.fish
работает, но мой опыт показывает , чтоsh
,echo '\\'
эхо\
иecho '\''
отголоски'
.echo '\\'
выводит \, потому что выecho
расширяете escape-последовательности ANSI C ( для этогоecho
нужны некоторые реализацииecho -e '\\'
).printf '%s\n' '\\'
выходы \\.sh
не идентифицирует конкретную оболочку, существует и было много разных и часто несовместимых оболочек, называемыхsh
.\'
это специальный токен внутри символьной последовательности в одинарных кавычках?