Aspas: simples, duplas e sem aspas — as diferenças
1. Por que as aspas são essenciais no Bash?
No Bash, as aspas não são meros enfeites estéticos — elas determinam como o interpretador processa seu código. Sem o uso correto de aspas, scripts que parecem funcionar podem quebrar silenciosamente quando encontraram nomes de arquivos com espaços, caracteres especiais ou variáveis vazias.
As aspas exercem três funções críticas:
- Proteção contra globbing: evitam que padrões como
*e?sejam expandidos para nomes de arquivos - Preservação de espaços e quebras de linha: impedem que o interpretador divida strings em múltiplos argumentos
- Controle sobre expansões: definem se variáveis (
$var) e substituições de comando ($(cmd)) serão interpretadas ou tratadas como texto literal
Cada tipo de aspas oferece um nível diferente de proteção e flexibilidade.
2. Sem aspas: expansão total e riscos
Quando você não usa aspas, o Bash realiza todas as expansões disponíveis:
$ nome="João Silva"
$ echo $nome
João Silva
Parece inocente? Experimente com um asterisco:
$ echo *.txt
relatorio.txt notas.txt backup.txt
O Bash expandiu *.txt para todos os arquivos que correspondem ao padrão. Isso é útil, mas perigoso:
$ arquivo="*.txt"
$ rm $arquivo # Remove TODOS os arquivos .txt, não o arquivo chamado "*.txt"
Espaços também causam estragos:
$ pasta="/home/user/Minha Pasta"
$ ls $pasta
ls: cannot access '/home/user/Minha': No such file or directory
ls: cannot access 'Pasta': No such file or directory
O Bash dividiu o valor em dois argumentos. Sempre que você precisar preservar espaços ou evitar globbing, as aspas são obrigatórias.
3. Aspas duplas ("..."): expansão controlada
Aspas duplas oferecem o melhor dos dois mundos: permitem expansão de variáveis e substituição de comandos, mas inibem globbing e preservam espaços:
$ mensagem="Arquivos: *.txt"
$ echo "$mensagem"
Arquivos: *.txt
Veja como o asterisco permanece literal. Já a expansão de variáveis continua funcionando:
$ nome="Maria"
$ echo "Olá, $nome"
Olá, Maria
Substituição de comandos também é permitida:
$ echo "Hoje é $(date +%A)"
Hoje é quarta-feira
Dentro de aspas duplas, você pode escapar caracteres específicos com \:
$ echo "Ela disse: \"Olá\""
Ela disse: "Olá"
A regra prática: use aspas duplas sempre que precisar do valor de uma variável, mas não quiser que espaços ou caracteres curinga causem problemas.
4. Aspas simples ('...'): literal absoluto
Aspas simples são a proteção máxima: nada é expandido. Tudo dentro delas é tratado como texto literal:
$ echo '$HOME $(whoami)'
$HOME $(whoami)
Nem mesmo escapes funcionam:
$ echo 'Não funciona: \'nada\''
bash: unexpected EOF while looking for matching `''
Para incluir uma aspa simples literal, você precisa sair da string, adicionar a aspa escapada e retornar:
$ echo 'Isto não funciona'``''
Isto não funciona'
Ou usar aspas duplas:
$ echo "Isto funciona 'assim'"
Isto funciona 'assim'
Aspas simples são ideais para:
- Strings com muitos caracteres especiais ($, `, \, !)
- Argumentos de comandos que não devem ser interpretados
- Atribuições de variáveis com conteúdo literal complexo
5. Aninhamento e combinações práticas
Na prática, você frequentemente combina aspas simples e duplas:
$ nome="João"
$ echo "A variável é '$nome'"
A variável é 'João'
Para situações mais complexas, você pode concatenar strings com aspas diferentes:
$ echo 'O valor de $HOME é '"$HOME"
O valor de $HOME é /home/usuario
Dentro de substituições de comando, o aninhamento exige cuidado:
$ echo "$(grep 'erro crítico' /var/log/syslog)"
Aqui, as aspas simples protegem a frase "erro crítico" dentro do grep, enquanto as aspas duplas externas preservam a saída completa.
Com printf, o uso correto de aspas evita problemas de formatação:
$ printf "%s\n" "$variavel_com_espacos"
6. Armadilhas comuns e boas práticas
Testes com [ e [[:
# ERRADO - quebra se $var estiver vazia ou tiver espaços
if [ $var = "texto" ]; then ...
# CORRETO
if [ "$var" = "texto" ]; then ...
# COM [[ ]] - mais seguro, mas ainda exige aspas no lado direito
if [[ "$var" == "texto" ]]; then ...
Operações com arquivos:
# PERIGOSO
rm -rf $diretorio
# SEGURO
rm -rf "$diretorio"
Argumentos posicionais:
# Preserva argumentos com espaços
for arg in "$@"; do
echo "$arg"
done
# "$*" junta todos em uma string
echo "Todos: $*"
Expressões regulares em [[ ]]:
# O padrão NÃO deve ter aspas
if [[ "$texto" =~ ^[0-9]+$ ]]; then
echo "É numérico"
fi
7. Resumo visual: tabela de comportamentos
| Expressão | Expansão de variável | Globbing | Preserva espaços |
|---|---|---|---|
$var |
Sim | Sim | Não |
"$var" |
Sim | Não | Sim |
'$var' |
Não | Não | Sim |
Exemplo prático demonstrando as diferenças:
$ conteudo="arquivo *.txt importante"
$ echo Sem aspas: $conteudo
Sem aspas: arquivo relatorio.txt notas.txt importante
$ echo Com aspas duplas: "$conteudo"
Com aspas duplas: arquivo *.txt importante
$ echo Com aspas simples: '$conteudo'
Com aspas simples: $conteudo
Regra de ouro: na dúvida, use aspas duplas. Elas protegem contra a maioria dos problemas sem impedir a expansão de variáveis. Use aspas simples apenas quando precisar de proteção total contra expansões. E sem aspas? Apenas quando você explicitamente deseja globbing e splitting — e mesmo assim, repense se não há uma maneira mais segura.
Referências
- Bash Reference Manual: Quoting — Documentação oficial da GNU sobre aspas simples, duplas e escapes
- Advanced Bash-Scripting Guide: Quoting — Guia avançado com exemplos detalhados de cada tipo de citação
- ShellCheck: SC2086 - Double quote to prevent globbing and word splitting — Ferramenta de análise estática que explica por que aspas duplas são necessárias
- Bash Hackers Wiki: Quoting and escaping — Wiki comunitária com tabelas comparativas e casos de borda
- Greg's Wiki: Quoting — Explicação concisa com armadilhas comuns e soluções práticas