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

  1. Exemplos
  2. Aspas simples
  3. Aspas duplas
  4. Caracter de escape
  5. Aspas ANSI C
  6. Comentários
  7. Exercícios
  8. Referências

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ênciaCaracter
\nnovalinha
\ttabulaçã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 ou tabulaçã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

Exercícios

Escolha os comandos para exibir as seguintes saídas

L!nux
Ba$h

Referências

Escrito por Caio Santesso.

Comentários

  • Conteúdo dos posts, exceto onde indicado contrário, licenciado sob a licença CC BY-SA 4.0 .