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 =
nos zsh
. Em algumas cascas, [
só é especial quando combinada (com algumas restrições) por a ]
.
Em alguns shells como bash
ou yash
, 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 depois set -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:
ksh
como POSIX, exceto que:
{string}
é especial se a string contém um aspas ,
(ou, ..
em alguns casos, e com algumas versões).
- O ksh93 possui um operador de citação especial adicional:
$'...'
com regras complexas. Esse operador também é encontrada (com algumas variações) em bash
, zsh
, mksh
e FreeBSD e busybox sh
.
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:
- nos códigos de idioma de caracteres de byte único, todos os caracteres em branco (de acordo com o código de idioma) são considerados delimitadores (como espaço ou tabulação). Com efeito, isso significa que você deve citar todos os bytes com o oitavo bit definido, caso eles possam ser um caractere em branco em algum código de idioma.
- Quando a expansão do histórico do csh é ativada, como em instâncias interativas,
!
é especial em alguns contextos e nem sempre as aspas duplas. E ^
é especial no início de um comando.
zsh
como ksh93
mas:
- mesma nota que para
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;}
).
- exceto
[
sozinho, [
necessidades citadas, mesmo que não sejam fechadas com a ]
.
- Com a
extendedglob
opção ativada, #
, ^
e ~
são englobamento operadores.
- Com a
braceccl
opção, {non-empty-string}
é especial.
$"..."
não é suportado.
- como uma peculiaridade especial,
?
não é especial ao seguir um %
(mesmo citado ou expandido) no início de uma palavra (para permitir a %?name
especificação do trabalho)
- uma
rcquotes
opção (não ativada por padrão) permite inserir aspas simples como ''
dentro de aspas simples à la rc
(veja abaixo).
yash
como POSIX
exceto isso.
- todos os caracteres em branco são considerados delimitadores.
- Com a
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:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
para remover o significado especial de apenas um caractere:
printf '<%s>\n' foo bar\ baz #comment
Acima, apenas o caractere de espaço precedido por a \
é passado literalmente para printf
. Os outros são tratados pelo shell como delimitadores de token.
- usar
"..."
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) $'\''
:
echo 'This is "tricky", isn'\''t it?'
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:
echo "`echo "foo bar"`"
O que não funciona com o shell Bourne ou as versões AT&T do ksh. Ou:
echo "`echo \"foo bar\"`"
Que funcionará com Bourne e AT&T ksh, mas não com yash
, mas use:
var=`echo "foo bar"`; echo "$var"
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:
var=`printf '%s\n' '\\'`
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 em yash
)) dentro das barras de reticulação, para que você precise
var=`printf '%s\n' '\\\\'`
ou
var=`printf '%s\n' '\\\'
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.
- a substituição de comando é somente via
`...`
sintaxe e dificilmente pode ser usada com segurança.
- a substituição de variáveis também é mal projetada e propensa a erros. Um
$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:
- aspas simples para citar a maioria dos caracteres.
!
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ília
rc
é o plan9
shell e como seus descendentes es
e akanga
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:
echo 'it''s so simple isn''t it?'
es
es
pode ser visto como um shell experimental baseado em rc
.
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.
=
,@
E%
são especiais em algumas conchas em alguns contextos.