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 laranja

Exemplo com início/fim: remover prefixo img_ de nomes de arquivos.

#!/bin/bash
ARQUIVO="img_foto.jpg"
echo "${ARQUIVO#img_}"  # Saída: foto.jpg

Comprimento

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"
fi

Para 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

Exercícios

  1. Escreva um comando que atribua à variável NOME o valor "Usuário" se a variável USUARIO não estiver definida ou estiver vazia. Em seguida, imprima NOME.

    ✓ Resposta:
    NOME=${USUARIO:-Usuário}
    echo "$NOME"
  2. Extraia os últimos 4 caracteres da string armazenada em ARQ="documento.txt" e armazene em EXT. Dica: use índices negativos.

    ✓ Resposta:
    ARQ="documento.txt"
    EXT=${ARQ: -4}
    echo "$EXT"  # .txt
  3. Dada 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 Roma
  4. Verifique se a variável EMAIL tem 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"
    fi
  5. Remova 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