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}: Sevarestiver vazia, retornapadrao. A variável original não muda.${var:=padrao}: Sevarestiver vazia, atribuipadraoa ela e retorna o valor.${var:?mensagem}: Sevarestiver vazia, exibemensageme interrompe o script.${var:+valor}: Sevarestiver definida, retornavalor; 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