Muitas perguntas como 'Como digitar o caractere de aspas duplas (")? estão sendo solicitadas e não queremos desorganizar nossa comunidade com a mesma resposta (digite-a como
\"
se não estivesse em'
s,"
se em'
s.) Portanto, a pergunta está aqui.
Você não pode digitar caracteres especiais em um terminal como os normais, por exemplo, este comando falhará:
echo Updates (11)
Então, como digitar esses caracteres no terminal como se fossem normais?
!#$^&*?[](){}<>~;'"\|<space><tab><newline>
shell
quoting
special-characters
EKons
fonte
fonte
=
,@
E%
são especiais em algumas conchas em alguns contextos.^M
) age como um feed de linha (^J
) para mim (Ubuntu 14.04, sh).^M
para^J
na entrada, mas^M
não é especial para o shell e não precisa citado. Digiteecho ^V^M | hd
e você verá o caractere 0d (e o 0a acrescentado por eco).hd
é, talvezxxd
seja melhor como um visualizador hexadecimal.od -tx1
oused -n l
xxd do vim, se você não tiverhd
. Alguns sistemas também têmcat -vte
oucat -A
Respostas:
Isso depende muito da concha. Verifique o manual do shell para obter detalhes.
Observe também que alguns caracteres são especiais apenas em alguns contextos. Por exemplo, na maioria dos shells,
*
e?
são especiais apenas em contextos de lista, em shells POSIX ou semelhantes a csh,~
é especial apenas no início de uma palavra ou após alguns caracteres como:
. Mesmo para=
noszsh
. Em algumas cascas,[
só é especial quando combinada (com algumas restrições) por a]
.Em alguns shells como
bash
ouyash
, caracteres especiais como delimitadores de token em branco também variam com o código do idioma.Os operadores de citação (para remover o significado especial desses caracteres) também variam muito entre os shells.
Conchas semelhantes a Bourne
Um resumo para os shells tipo Bourne (que são conhecidos por serem chamados
sh
em algum sistema ou outro desde os anos 80):Casca de Bourne
Caracteres especiais:
"\'&|;()^`<>$
, space, newline e tab são especiais em linhas de comando simples quando não estão entre aspas.#
(exceto na versão anterior) é especial no início de uma linha ou após um espaço, aspas ou tabulação sem aspas&|()^<>;`
.{
e}
são especiais apenas porque são palavras-chave do shell (portanto, apenas palavras na posição de comando).*?[
são especiais como operadores de globbing, portanto, apenas em contextos de lista. No caso de[
, é[...]
esse o operador de globbing, que precisa ser citado[
ou]
somente para remover o significado especial.=
é especial quando em contextos onde é tratado como um operador de atribuição. Ou seja, em um comando simples, para todas as palavras que não seguem um argumento (exceto depoisset -k
).Citando operadores
\
cita todos os caracteres especiais, exceto nova linha (\<newline>
é uma maneira de continuar uma longa linha lógica na próxima linha física , para que a sequência seja removida). Observe que os backticks adicionam complexidade extra, pois\
são usados primeiro para escapar do backtick de fechamento e ajudar o analisador. Dentro de aspas duplas,\
só pode ser usado para escapar de si próprio"
,$
e`
(\<newline>
ainda é uma continuação de linha). Dentro de um documento aqui, o mesmo, exceto"
.\
é a única maneira de escapar caracteres dentro dos documentos aqui."..."
aspas escapar todos os personagens, mas em si,\
,$
e`
.'...'
aspas simples escapam a todos os caracteres, exceto a si próprio.Cartuchos POSIX
Os shell POSIX se comportam principalmente como o shell Bourne, exceto que:
^
não é mais um caractere especial~
é especial em alguns contextos{
é permitido ser especial, por isso deve ser citado.ksh
como POSIX, exceto que:
{string}
é especial se a string contém um aspas,
(ou,..
em alguns casos, e com algumas versões).$'...'
com regras complexas. Esse operador também é encontrada (com algumas variações) embash
,zsh
,mksh
e FreeBSD e busyboxsh
.ksh93
também possui um$"..."
operador de citação que funciona assim,"..."
exceto que a string está sujeita à localização (pode ser configurada para ser traduzida para o idioma do usuário).mksh
ignora o$
no$"..."
.bash
como
ksh93
mas:!
é especial em alguns contextos e nem sempre as aspas duplas. E^
é especial no início de um comando.zsh
como
ksh93
mas:bash
a expansão do histórico do csh=
é especial como o primeiro caractere de uma palavra (=ls
expande para/bin/ls
).{
e}
também pode abrir e fechar grupos de comandos quando não delimitados (como em{echo text}
trabalhos como os de Bourne{ echo text;}
).[
sozinho,[
necessidades citadas, mesmo que não sejam fechadas com a]
.extendedglob
opção ativada,#
,^
e~
são englobamento operadores.braceccl
opção,{non-empty-string}
é especial.$"..."
não é suportado.?
não é especial ao seguir um%
(mesmo citado ou expandido) no início de uma palavra (para permitir a%?name
especificação do trabalho)rcquotes
opção (não ativada por padrão) permite inserir aspas simples como''
dentro de aspas simples à larc
(veja abaixo).yash
como
POSIX
exceto isso.brace-expand
opção, implementa a expansão de chaves no estilo zsh.Para todos os shells, existem alguns contextos especiais em que a citação funciona de maneira diferente. Já mencionamos aqui documentos e backticks, mas também existem
[[...]]
no ksh e em alguns outros shells, POSIX$((...))
,case
construções ...Observe também que a citação pode ter outros efeitos colaterais quando se trata de expansões (com aspas duplas) ou quando aplicada a delimitadores de documentos aqui. Ele também desativa as palavras reservadas e afeta a expansão do alias.
Sumário
Nos shells tipo Bourne
!#$^&*?[(){}<>~;'"`\|=
, SPC, TAB, NEWLINE e alguns bytes com o conjunto de 8 bits são ou podem ser especiais (pelo menos em alguns contextos).Para remover o significado especial para que eles sejam tratados literalmente, use aspas.
Usar:
'...'
para remover o significado especial de cada caractere:\
para remover o significado especial de apenas um caractere:Acima, apenas o caractere de espaço precedido por a
\
é passado literalmente paraprintf
. Os outros são tratados pelo shell como delimitadores de token."..."
para citar personagens enquanto ainda permitindo expansão de parâmetros ($var
,$#
,${foo#bar}
...), a expansão aritmética ($((1+1))
também$[1+1]
em algumas conchas) e substituição de comando ($(...)
ou a velha forma`...`
. Na verdade, na maioria das vezes, você quer colocar essas expansões dentro aspas duplas em qualquer caso.Você pode usar\
dentro"..."
para remover o significado especial dos caracteres que ainda são especiais (mas apenas eles).se a string contiver
'
caracteres, você ainda poderá usar'...'
o restante e usar outros mecanismos de cotação que podem citar'
como"'"
ou\'
ou (quando disponível)$'\''
:Use a
$(...)
forma moderna de substituição de comando. Use o antigo apenas`...`
para compatibilidade com o shell Bourne, ou seja, para um sistema muito antigo e apenas em atribuições de variáveis, como em não use:O que não funciona com o shell Bourne ou as versões AT&T do ksh. Ou:
Que funcionará com Bourne e AT&T ksh, mas não com
yash
, mas use:que funcionará com todos.
Também é impossível aninha-los de maneira portável com aspas duplas; portanto, novamente, use variáveis. Também tenha cuidado com o processamento especial de barra invertida:
Armazenará apenas uma barra invertida dentro
$var
, porque há um nível extra de processamento de barra invertida (para\
, `e$
(e também"
quando citado, exceto emyash
)) dentro das barras de reticulação, para que você preciseou
em vez de.
Família Csh
O csh e o tcsh têm uma sintaxe significativamente diferente, embora ainda haja muito em comum com o shell Bourne, pois eles compartilham uma herança comum.
Caracteres especiais:
"\'&|;()^`<>$
, espaço, nova linha e guia são especiais em todos os lugares quando não estão entre aspas.#
(csh é o shell que foi introduzido#
como líder do comentário) é especial no início de um script ou após um espaço, guia ou nova linha não citada.*?[
são especiais como operadores de globbing, portanto, em contextos de lista{non-empty-string}
é especial (csh é o shell que introduziu a expansão entre chaves).!
e^
são especiais como parte da expansão da história (novamente, uma invenção da csh), e as regras de citação são especiais.~
(expansão til também uma invenção csh) é especial em alguns contextos.Citando operadores
Eles são os mesmos do shell Bourne, mas o comportamento é diferente. Se o tcsh se comportar como o csh do ponto de vista da sintaxe, você verá que muitas versões do csh têm erros desagradáveis. Obtenha a versão mais recente do tcsh para obter uma versão mais ou menos funcional do csh.
\
escapa um único caractere, exceto nova linha (o mesmo que para o shell Bourne). É o único operador de cotação que pode escapar!
.\<newline>
não escapa, mas o transforma de um separador de comandos em um separador de token (como espaço)"..."
escapa todos os personagens exceto o próprio,$
,`
, nova linha e!
. Ao contrário do shell Bourne, você não pode usar\
para escapar$
e`
entrar por dentro"..."
, mas pode usar\
para escapar!
ou nova linha (mas não ela mesma, exceto quando antes de uma!
ou nova linha). Um literal!
é"\!"
e um literal\!
é"\\!"
.'...'
escapa a todos os caracteres, exceto a si próprio!
e a nova linha. Como nas aspas duplas, a!
nova linha pode ser escapada com barra invertida.`...`
sintaxe e dificilmente pode ser usada com segurança.$var:q
operador ajuda a escrever um código mais confiável envolvendo variáveis.Sumário
Fique longe do csh, se puder. Se você não pode usar:
!
e nova linha ainda precisa de um\
.\
pode escapar da maioria dos personagens"..."
pode permitir algumas expansões dentro dele, mas isso é bastante problemático se incorporarem caracteres de nova linha e / ou barra invertida; o melhor é usar apenas aspas simples e$var:q
para expansão variável. Você precisará usar loops se desejar unir elementos de uma matriz de maneira confiável.rc
famíliarc
é oplan9
shell e como seus descendenteses
eakanga
foi portado para Unix e unix-likes. É um shell com uma sintaxe muito mais limpa e melhor e o que todo mundo usaria se não fôssemos presos a shells tipo Bourne para compatibilidade com versões anteriores.rc
/akanga
Caracteres especiais
#;&|^$=`'{}()<>
, SPC, TAB e NEWLINE são sempre especiais quando não estão entre aspas.*?[
são operadores de globbing.Operador de cotação
'...'
é o único operador de cotação. A Litteral'
é escrito com''
dentro de aspas simples como em:es
es
pode ser visto como um shell experimental baseado emrc
.No entanto, existem algumas diferenças. O que interessa a esta Q / A é que
\
também é um operador de citação (que cita todos os caracteres especiais, exceto nova linha) e também pode ser usado para introduzir sequências de escape como\n
para nova linha,\b
para barra invertida ...peixe
fish é um recém-chegado relativo (por volta de 2005), destina-se principalmente ao uso interativo e também possui uma sintaxe significativamente diferente de outras conchas.
caracteres especiais
"'\()$%{}^<>;&|
sempre especial quando não citado (observe%
(para expansão pid) como uma diferença significativa de outras conchas e`
não é especial)#
(comentário) especial ao seguir espaço sem aspas, tabulação, nova linha ou;&|^<>
*?
[...]
operadores de globbing (mas não )Citando operadores
\
cita um único caractere especial, exceto nova linha, mas cuidado, ele também funciona como um introdutor de sequência de escape C (\n
,\b
...). IOW,\n
não é uma citação,n
mas uma nova linha."..."
cita tudo, menos ele próprio,$
e a barra invertida e a barra invertida podem ser usadas para escapar deles.\<newline>
é uma continuação de linha (removida) dentro"..."
.'...'
cita tudo, menos ele próprio e\
, e você pode usar barra invertida para escapar deles.fonte
c
funcionem da mesma forma\c
,c
não sejamc: command not found
exibidos no STDERR, etc.) E eu estou falandosh
aqui. Além disso, lembre-se de que esta é uma pergunta de "limpeza", ou seja, está aqui para cobrir todos esses personagens, portanto não será necessário fazer mais de 19 perguntas. A pergunta foi postada graças a um incidente em que perguntas diferentes são feitas para diferentes personagens, certamente queremos limpar aqui!?[
são operadores globbing, mas não são especiais em todos os contextos, mas*
parecem ser, porque estãoecho *
malecho
o conteúdo do diretório atual (não escapando a nada).echo ?
ecoa um literal?
eecho [
ecoa um literal[
. Além disso,]
é um oberator globbing também.*
medida que a glob se expande para todos os arquivos?
não ocultos,[a-z]
para arquivos de caractere único não ocultos, para arquivos cujo nome é um caractere único entre a e z e assim por diante. Quando eles não correspondem a nenhum arquivo (como no seu caso?
), dependendo do shell, você recebe um erro de não correspondência ou o padrão se expande. Em qualquer caso, mesmo em shell onde eles se expandir para si mesmos, eles precisam citado no caso de eles podem corresponder a um arquivo.*
ainda se expande para algo.*
é como?
, se não corresponder (apenas no caso*
, é quando há apenas arquivos ocultos no diretório atual, poisa*
é onde não há nenhum arquivo cujo nome comece coma
...), ele se expande para em si (mais Bourne-como conchas), ou gera um erro no-jogo (csh
,tcsh
,fish
(aviso),zsh
,bash -O failglob
, primeiros conchas Unix), (ou se expande para nada com a opção nullglob de algumas conchas ou se há outro padrão que se expande para algo em csh, tcsh, zsh -o cshnullglob, shells iniciais do unix).1. Fuga
Escape de todos esses caracteres com a
\
, como este (não funciona em novas linhas / retornos de carro):2. Citação dupla
Coloque o texto inteiro em
"
s, assim:3. aspas simples
O mesmo que aspas duplas, mas não há token especial.
fonte
fish
shell, e não dos shell Bourne, onde a aspas simples cita todos os caracteres (a barra invertida não é especial no interior'...'
). Observe que emfish
,%
também é um caractere especial.fish
funciona, mas minha experiência é que, emsh
,echo '\\'
ecos\
eecho '\''
ecos'
.echo '\\'
\ outputs porque vocêecho
expande seqüências de escape ANSI C (algumasecho
implementações precisamecho -e '\\'
disso).printf '%s\n' '\\'
saídas \\.sh
não identifica um shell específico, existem e já foram chamados muitos shells diferentes e geralmente incompatíveissh
.\'
um token especial em uma sequência de caracteres entre aspas simples?