Aspas e expansão
Esta aula aborda o uso de aspas simples, duplas e escape no shell Bash, explicando como controlar a expansão de variáveis e o word splitting. Você aprenderá a escrever scripts mais previsíveis e seguros, evitando erros comuns com espaços e caracteres especiais.
No shell Bash, o tratamento de strings e a expansão de variáveis são controlados por aspas e caracteres de escape. Entender essas regras é essencial para escrever scripts que se comportem de forma previsível, especialmente ao lidar com nomes de arquivos que contêm espaços, caracteres especiais ou ao passar argumentos para comandos. Nesta aula, exploraremos as diferenças entre aspas simples e duplas, o uso do escape, a expansão de variáveis e o fenômeno de word splitting.
Dominar esses conceitos evita bugs sutis e vulnerabilidades de segurança, como injeção de comandos. Vamos começar com os fundamentos e avançar para exemplos práticos.
Aspas simples vs duplas
Aspas simples (' ') preservam o conteúdo literalmente, sem nenhuma expansão. Isso significa que variáveis, comandos entre backticks ou expressões aritméticas não são interpretados. Já as aspas duplas (" ") permitem a expansão de variáveis e comandos, mas ainda protegem contra word splitting e globbing (expansão de curingas).
Por exemplo:
nome="João"
echo 'Olá, $nome' # Imprime: Olá, $nome
echo "Olá, $nome" # Imprime: Olá, JoãoNo primeiro echo, o $nome não é expandido porque está entre aspas simples. No segundo, as aspas duplas permitem a expansão. Use aspas simples quando quiser exatamente o texto digitado, sem qualquer interpretação.
Escape
O caractere de escape \ (barra invertida) remove o significado especial do próximo caractere. Por exemplo, para incluir um cifrão literal, uma aspa dupla ou uma barra invertida em uma string, você pode escapá-los.
echo "Preço: \$10" # Imprime: Preço: $10
echo "Ela disse: \"Olá\"" # Imprime: Ela disse: "Olá"
echo Caminho: C:\\Users # Imprime: C:\UsersFora de aspas, o escape também pode ser usado para inserir quebras de linha (\n) ou tabulações (\t), mas dentro de aspas duplas eles são preservados como literais a menos que sejam interpretados pelo comando echo -e ou printf.
Expansão de variáveis
A expansão de variáveis ocorre quando o shell encontra um $ seguido do nome da variável. Isso acontece tanto fora de aspas quanto dentro de aspas duplas. Dentro de aspas simples, a expansão é suprimida.
nome="Maria"
echo $nome # Imprime: Maria
echo "$nome" # Imprime: Maria
echo '$nome' # Imprime: $nomeAlém da expansão simples, há formas de modificar o valor, como ${nome:-padrão} (valor padrão), ${nome:?erro} (exibe erro se vazia), ${nome%sufixo} (remove sufixo), entre outras. Essas expansões são úteis para manipulação de strings.
Word splitting
Word splitting é o processo pelo qual o shell divide uma string em palavras separadas, usando o valor da variável IFS (Internal Field Separator) como delimitador. Por padrão, IFS contém espaço, tab e nova linha. Quando uma variável não está entre aspas duplas, seu valor é sujeito a word splitting após a expansão.
arquivos="arq1 arq2 arq3"
for f in $arquivos; do # Itera sobre arq1, arq2, arq3
echo "$f"
done
# Com aspas duplas, a string é tratada como uma única palavra
for f in "$arquivos"; do # Itera uma vez, com a string inteira
echo "$f"
doneWord splitting pode causar problemas ao lidar com nomes de arquivos que contêm espaços. Por isso, é uma boa prática sempre usar aspas duplas ao expandir variáveis que representam nomes de arquivos ou argumentos que não devem ser quebrados.
Boas práticas
- Sempre use aspas duplas ao expandir variáveis (
"$var") a menos que explicitamente queira word splitting ou globbing. - Use aspas simples para strings literais que não precisam de expansão.
- Escape caracteres especiais quando necessário, especialmente em expressões regulares ou strings passadas para comandos como
sedouawk. - Teste seus scripts com nomes de arquivos contendo espaços para garantir que estão corretamente citados.
Referências
- GNU Bash Manual: Quoting
- GNU Bash Manual: Shell Parameter Expansion
- Greg's Wiki: Word Splitting
- Bash Hackers Wiki: Words
- Devhints: Bash quoting cheatsheet
Exercícios
O que será impresso pelo comando
echo 'Olá $USER'quando a variável USER estiver definida? Explique.✓ Resposta: Imprime literalmenteOlá $USERporque aspas simples suprimem a expansão de variáveis.Escreva um comando que imprima o conteúdo da variável
caminhosem que ocorra word splitting, assumindo quecaminhocontém espaços.✓ Resposta:echo "$caminho"(aspas duplas ao redor da variável).Explique a diferença entre
echo "*"eecho *em um diretório com arquivos.✓ Resposta:echo "*"imprime um asterisco literal, enquantoecho *expande o curinga para listar todos os arquivos do diretório (globbing).Como você faria para imprimir a string
"Custa $10"(com aspas duplas e cifrão literais)?✓ Resposta:echo "\"Custa \$10\""ouecho '"Custa $10"'(usando aspas simples).Dado
a=" um dois ", quantas palavras são geradas porfor i in $a; do echo "$i"; done? E porfor i in "$a"; do echo "$i"; done?✓ Resposta: No primeiro caso, word splitting gera duas palavras:umedois(espaços extras são ignorados). No segundo, a string inteira (incluindo espaços) é tratada como uma única palavra.