Aspas simples e duplas, escape e comentários no Bash
Aspas em Bash servem para remover significados de caracteres especiais . Caracteres como !
and $
são interpretados pelo Bash e podem ser substituídos caso não envoltos em aspas ou precedidos pelo caracter de escape \
.
As aspas ''
, ""
e $''
, bem como o caracter de escape \
, são caracteres especiais. Por isso também estão sujeitos à interpretação do Bash.
Ao interpretar o par de aspas, Bash preserva o valor literal de todos ou certos caracteres inseridos entre elas, e então as remove.
Conteúdo
Exemplos
Caso de uso: espaço
Para excluir o arquivo nova foto.png
, o comando abaixo poderia equivocadamente ser executado.
rm nova foto.png
Que resultaria em:
rm: cannot remove 'nova': No such file or directory
rm: cannot remove 'foto.png': No such file or directory
Pois, como espaço
é interpretado como separador de palavras em Bash, rm
receberia dois argumentos: nova
e foto.png
.
Para que rm
receba apenas um argumento, espaço
deve ser tratado como um caracter regular ao invés de interpretado como separador de palavras.
Quaisquer uma das formas a seguir é válida para tal fim.
rm 'nova foto.png'
rm "nova foto.png"
rm nova\ foto.png
rm $'nova\ foto.png'
Caso de uso: novalinha
Suponha que precisemos exibir caracteres em duas linhas diferentes...
Ao pressionarmos Enter
o caracter de controle nova linha
é inserido.
Para utilizar nova linha
como literal, o que permite caracteres em linhas diferentes, qualquer par de aspas pode ser utilizado.
echo 'linha 1
linha 2'
echo "linha 1
linha 2"
echo $'linha 1
linha 2'
Saída de qualquer um dos comandos anteriores.
linha 1
linha 2
Aspas simples
Qualquer caractere inserido entre um par de aspas simples ''
retém seu valor literal, com exceção de '
.
São utilizadas tipicamente quando nenhuma expansão é desejada.
Suponha que queíramos exibir Um $dolar
no terminal. O seguinte comando...
echo Um $dolar
... produz a indesejada saída...
Um
... pois $dolar
contém um caracter especial: $
.
Bash interpreta $dolar
como uma expansão de variável . Dado que a variável dolar
não foi previamente definida, a expansão resulta em vazio.
Para $
ser tratado como literal, $
deve estar em qualquer posição entre um par de aspas simples.
echo 'Um $dolar'
Saída, como esperado:
Um $dolar
Aspas duplas
""
retêm o valor literal de caracteres, exceto dos caracteres especiais $
, `
, \
e !
.
Aspas duplas são especialmente úteis ao ler variáveis cujo valor contém espaço e algum tipo de expansão.
Expansão de variável entre aspas duplas
Para criar um arquivo com um nome pseudo-aleatório poderíamos utilizar a variável do Bash RANDOM
como argumento de touch
.
touch arquivo ${RANDOM}.txt
ls
673.txt arquivo
Porém dois arquivos seriam criados, já que, como visto na seção anterior, espaço
é interpretado como separador de palavras.
Aspas simples não são uma alternativa uma vez que não permitem expansão de variável.
Para permitir a expansão de variável e tratar espaço
literalmente: aspas duplas.
touch "arquivo ${RANDOM}.txt"
ls
'arquivo 21871.txt'
Caracter de escape entre aspas duplas
Entre aspas duplas, o caracter de escape \
pode anteceder novalinha
, $
, `
, \
, !
e "
para tratá-los como literais.
Após interpretado, \
é removido...
echo " \" \` \\ \$ "
" ` \ $
...exceto para !
, onde \
não é removido.
echo "\!!"
\!!
Aspa simples entre aspas duplas
Aspas duplas também retêm o valor literal da aspa simples.
echo "Aspa 'simples' "
Aspa 'simples'
Caracter de escape
\
mantém o valor literal do caracter que o sucede.
Após interpretado, o caracter de escape \
é removido.
echo \var\iavel \$USER
variavel $USER
novalinha
Quando antecedido por \
, novalinha
é ignorado.
Todos os caracteres após \novalinha
são processados como se estivessem na mesma linha que \novalinha
.
Funcionalidade particularmente útil para aprimorar legibilidade de comandos com vários argumentos.
echo
recebe os mesmos argumentos nos dois comandos abaixo.
echo A \
B
echo A B
Saída para qualquer um dos dois comandos.
A B
Aspas ANSI C
$''
preservam o valor literal dos caracteres, exceto por sequências de escape ANSI C.
Sequências de escape ANSI C representam caracteres que apresentam dificuldade em ser representados diretamente.
Quando interpretadas, essas sequências são substituídas pelos caracteres correspondentes. Lista parcial de sequências de escape abaixo.
Sequência | Caracter |
---|---|
\n | novalinha |
\t | tabulação |
\' | ' |
\" | " |
\\ | \ |
No comando abaixo, \t
, \n
e \"
são interpretados, e assim substituídos, por Bash antes de serem enviados para echo
.
echo $'A\tB\nC \"D\"'
A B
C "D"
Alternativamente, alguns comandos interpretam as sequências de escape independentemente do uso de aspas ANSI C $''
.
Como no caso abaixo, em que a opção -e
de echo
ativa a interpretação.
echo -e "A\nB"
A
B
Caracteres Unicode
Podem ser representados utilizando \U
+ ponto de código com 1 a 8 dígitos hexadecimais.
echo $'Heavy Metal \U1F918\nCafé \U2615'
Heavy Metal 🤘
Café ☕
Comentários
Caracteres após #
são ignorados quando #
:
- É antecedido por um separador de campo (
espaço
,novalinha
outabulação
); - Ou aparece no começo da linha.
São especialmente úteis para descrever trechos de código e comandos complexos.
# Comando para exibir o caracter A.
echo A #Comentário
A