Guia de Manipulação de Strings no Shell Bash

O processamento de strings é uma tarefa fundamental no desenvolvimento de scripts Linux. O Bash oferece uma série de expansões de parâmetros integradas que permitem manipular textos de forma eficiente, sem a necessidade constante de ferramentas externas como sed ou awk.

Conversão de Maiúsculas e Minúsculas

A partir da versão 4 do Bash, foram introduzidos atalhos simples para alterar a capitalização de variáveis:

# Converte apenas o primeiro caractere para maiúsculo
${variavel^}

# Converte todos os caracteres para maiúsculo
${variavel^^}

# Converte apenas o primeiro caractere para minúsculo
${variavel,}

# Converte todos os caracteres para minúsculo
${variavel,,}

Veja um exemplo prático:

#!/bin/bash
texto="exemplo de TEXTO"
echo "Original: $texto"
echo "Primeira maiúscula: ${texto^}"
echo "Tudo em maiúsculo: ${texto^^}"
echo "Primeira minúscula: ${texto,}"
echo "Tudo em minúsculo: ${texto,,}"

Obtendo o Comprimento da String

Para contar quantos caracteres existem em uma variável, utilize a sintaxe ${#string}. Esta é a forma mais rápida, pois é processada internamente pelo shell.

frase="Shell Scripting"
echo "O tamanho da string é: ${#frase}"

Extração de Substrings (Slicing)

Existem diferentes formas de extrair partes de uma string. A tabela abaixo resume as abordagens:

Método Sintaxe Observação
Expansão Bash ${var:inicio:tamanho} Índice começa em 0. Melhor performance.
Comando expr expr substr "$var" inicio tamanho Índice começa em 1.
Comando cut echo $var | cut -b inicio-fim Usa bytes; índice começa em 1.

Exemplos de Expansão de Parâmetros

# Extrai do índice 5 até o final
${string:5}

# Extrai 4 caracteres a partir do índice 8
${string:8:4}

# Extrai os últimos 6 caracteres (note o espaço após o dois-pontos)
${string: -6}

# Extrai 3 caracteres começando da quinta posição a partir do fim
${string: -5:3}

Remoção de Padrões (Matching)

O Bash permite remover partes de uma string com base em padrões de correspondência (globbing):

  • ${var#padrão}: Remove a menor ocorrência do padrão no início.
  • ${var##padrão}: Remove a maior ocorrência do padrão no início.
  • ${var%padrão}: Remove a menor ocorrência do padrão no fim.
  • ${var%%padrão}: Remove a maior ocorrência do padrão no fim.
#!/bin/bash
caminho="/usr/local/bin/script.sh"

echo "Nome do arquivo: ${caminho##*/}"     # Remove tudo até a última barra
echo "Diretório: ${caminho%/*}"            # Remove da última barra em diante
echo "Sem extensão: ${caminho%.*}"         # Remove a extensão curta
echo "Caminho base: ${caminho%%/bin*}"     # Remove a partir da primeira ocorrência de /bin

Substituição de Texto

Você pode localizar e substituir partes de uma variável facilmente:

# Substitui apenas a primeira ocorrência
${string/padrao/substituto}

# Substitui todas as ocorrências
${string//padrao/substituto}

# Substitui apenas se estiver no início da string
${string/#padrao/substituto}

# Substitui apenas se estiver no final da string
${string/%padrao/substituto}

Exemplo:

url="www.exemplo.com.br"
echo ${url/www/http://www}
echo ${url//./-}  # Troca todos os pontos por hifens

Tratamento de Valores Padrão e Variáveis Vazias

Essas expressões são essenciais para garantir que seus scripts não quebrem quando variáveis de ambiente ou argumentos não forem fornecidos.

  • ${var:-padrao}: Se var estiver vazia, retorna padrao. A variável original não muda.
  • ${var:=padrao}: Se var estiver vazia, atribui padrao a ela e retorna o valor.
  • ${var:?mensagem}: Se var estiver vazia, exibe mensagem e interrompe o script.
  • ${var:+valor}: Se var estiver definida, retorna valor; caso contrário, retorna vazio.
# Exemplo de configuração de porta padrão
PORTA_APP=${PORTA:-8080}

# Exemplo de verificação de diretório crítico
RAIZ_PROJETO=${DIR_BASE:?"Erro: A variável DIR_BASE não foi definida!"}

Aálise de Performance

Em Shell Scripting, o uso de recursos internos do Bash é significativamente mais rápido do que invocar processos externos. Veja a comparação de tempo para contar caracteres em um loop de 10.000 iterações:

# Muito Rápido (Interno)
for i in {1..10000}; do tam=${#variavel}; done

# Lento (Processo Externo)
for i in {1..10000}; do tam=$(echo -n $variavel | wc -m); done

# Médio/Lento (Processo Externo)
for i in {1..10000}; do tam=$(expr length "$variavel"); done

O uso de ferramentas como wc ou expr pode ser de 10 a 50 vezes mais lento devido ao custo de criação de novos processos (fork/exec) no sistema operacional.

Dicas Adicionais

Concatenação

Para concatenar strings, basta colocá-las lado a lado:

parte1="Shell"
parte2="Script"
completo="${parte1}_${parte2}.sh"
echo $completo # Resultado: Shell_Script.sh

Comparações Lógicas

# Comparação simples
if [[ "$str1" == "$str2" ]]; then ... fi

# Verificação por padrão (regex)
if [[ "$arquivo" =~ \.log$ ]]; then
    echo "É um arquivo de log"
fi

Tags: Bash Shell Script Linux Automação programação

Publicado em 9-18 15:19