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