Expansão de parâmetros
Esta aula aborda a expansão de parâmetros no Bash, uma ferramenta poderosa para manipular variáveis diretamente no shell. Você aprenderá a definir valores padrão, extrair substrings, substituir padrões e obter o comprimento de strings, tudo com exemplos práticos.
A expansão de parâmetros é um recurso do Bash que permite manipular o conteúdo de variáveis de forma concisa e eficiente, sem a necessidade de comandos externos como sed ou awk. Ela é amplamente utilizada em scripts para fornecer valores padrão, extrair partes de strings, substituir padrões e obter o comprimento de strings. Nesta aula, exploraremos as principais formas de expansão de parâmetros, com exemplos práticos que demonstram seu uso cotidiano.
Dominar a expansão de parâmetros torna seus scripts mais legíveis, rápidos e portáveis, pois você evita subprocessos desnecessários. Vamos mergulhar em cada técnica.
Valores padrão (${var:-})
Frequentemente, você deseja usar uma variável, mas se ela não estiver definida ou estiver vazia, um valor padrão deve ser usado. A sintaxe ${var:-valor} expande para o valor de var se ela estiver definida e não vazia; caso contrário, expande para valor. Isso é útil para definir argumentos de linha de comando, configurações ou caminhos padrão.
Exemplo: suponha que seu script aceite um diretório de saída opcional. Se o usuário não fornecer, use o diretório atual.
#!/bin/bash
# Exemplo de valor padrão
SAIDA=${1:-.}
echo "Usando diretório de saída: $SAIDA"Também existe a variação ${var:=valor}, que atribui o valor padrão à variável se ela estiver vazia ou não definida, além de expandir para ele. Use com cuidado para evitar efeitos colaterais.
Substring
Com a expansão de parâmetros, você pode extrair uma substring de uma variável sem usar cut ou expr. A sintaxe é ${var:posição} para extrair da posição até o final, ou ${var:posição:comprimento} para extrair um número específico de caracteres. As posições são baseadas em zero.
Exemplo: extrair os primeiros 5 caracteres de uma string.
#!/bin/bash
TEXTO="Olá, mundo!"
echo "Primeiros 5 caracteres: ${TEXTO:0:5}" # Saída: Olá,
echo "A partir do 5º caractere: ${TEXTO:5}" # Saída: mundo!Você também pode usar índices negativos (a partir do final) em versões recentes do Bash, mas com cuidado: ${var: -3} (note o espaço) extrai os últimos 3 caracteres.
Substituição de padrão
O Bash permite substituir partes de uma string que correspondem a um padrão, de forma similar ao sed. Existem duas formas:
${var/padrao/substituto}- substitui a primeira ocorrência do padrão.${var//padrao/substituto}- substitui todas as ocorrências.
O padrão pode conter curingas como * e ?. Se o padrão começa com #, a correspondência é feita no início da string; com % no final.
Exemplo: substituir vírgulas por espaços.
#!/bin/bash
LISTA="maçã,banana,laranja"
# Substituir primeira vírgula
echo "${LISTA/,/ }" # Saída: maçã banana,laranja
# Substituir todas as vírgulas
echo "${LISTA//,/ }" # Saída: maçã banana laranjaExemplo com início/fim: remover prefixo img_ de nomes de arquivos.
#!/bin/bash
ARQUIVO="img_foto.jpg"
echo "${ARQUIVO#img_}" # Saída: foto.jpgComprimento
Para obter o comprimento de uma string contida em uma variável, use ${#var}. Isso é útil para validações ou para iterar sobre caracteres (embora existam outras formas). O comprimento é contado em número de caracteres (bytes, dependendo do locale).
Exemplo: verificar se uma senha tem pelo menos 8 caracteres.
#!/bin/bash
SENHA="minhaSenha"
if [ ${#SENHA} -ge 8 ]; then
echo "Senha válida (${#SENHA} caracteres)"
else
echo "Senha muito curta"
fiPara arrays, ${#array[@]} retorna o número de elementos, e ${#array[i]} o comprimento do elemento no índice i.
Boas práticas
- Use
${var:-}para fornecer valores padrão sem modificar a variável. - Prefira a substituição de padrão do Bash em vez de comandos externos, a menos que precise de expressões regulares mais complexas.
- Cuidado com espaços em branco: a expansão de parâmetros preserva espaços internos, mas a expansão de variáveis sem aspas pode sofrer word splitting.
- Sempre cite as variáveis ao usar expansão para evitar quebra inesperada de palavras.
Referências
- Documentação oficial do Bash: Expansão de Parâmetros
- Advanced Bash-Scripting Guide: Parameter Substitution
- Bash Hackers Wiki: Parameter Expansion
- Bash Conditional Expressions (para uso com comprimento)
- Greg's Wiki: Bash FAQ - Parameter Expansion
Exercícios
Escreva um comando que atribua à variável
NOMEo valor "Usuário" se a variávelUSUARIOnão estiver definida ou estiver vazia. Em seguida, imprimaNOME.✓ Resposta:NOME=${USUARIO:-Usuário} echo "$NOME"Extraia os últimos 4 caracteres da string armazenada em
ARQ="documento.txt"e armazene emEXT. Dica: use índices negativos.✓ Resposta:ARQ="documento.txt" EXT=${ARQ: -4} echo "$EXT" # .txtDada a string
FRASE="O rato roeu a roupa do rei de Roma", substitua todas as ocorrências de "ro" por "RA" e imprima o resultado.✓ Resposta:FRASE="O rato roeu a roupa do rei de Roma" echo "${FRASE//ro/RA}" # O RAto RAeu a RAupa do rei de RomaVerifique se a variável
EMAILtem pelo menos 10 caracteres. Se sim, imprima "Válido"; caso contrário, "Inválido".✓ Resposta:if [ ${#EMAIL} -ge 10 ]; then echo "Válido" else echo "Inválido" fiRemova o prefixo "tmp_" do nome de arquivo
ARQ="tmp_backup.tar.gz"e imprima o nome limpo.✓ Resposta:ARQ="tmp_backup.tar.gz" echo "${ARQ#tmp_}" # backup.tar.gz