De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 24 de setembro de 2025
O uso de expansão de parâmetros em Bash pode trazer ganhos significativos de performance quando comparado a alternativas que utilizam comandos externos ou scripts mais complexos. Esses ganhos são possíveis devido à maneira como a expansão de parâmetros opera: ela faz parte do shell interno, sem a necessidade de criar novos processos (fork/exec) para lidar com as operações.
1. Operação Interna ao Shell
sed
, awk
, ou grep
. Isso elimina a sobrecarga de criar novos processos no sistema operacional, o que consome tempo e recursos.
2. Eliminação de Forks e Execuções
fork()
).
exec()
).
3. Redução de I/O
Comandos externos costumam realizar operações de leitura/escrita no sistema de arquivos (por exemplo, processar um arquivo temporário ou redirecionar saídas). Já a expansão de parâmetros opera diretamente na memória, o que é muito mais rápido.
4. Manipulação Simplificada
Expansão de parâmetros permite resolver problemas complexos (como cortar substrings, substituir trechos de texto, ou fornecer valores padrão) em apenas uma única operação, enquanto comandos externos exigem uma sequência (e, muitas vezes, pipelines), resultando em maior custo computacional.
Exemplo 1: Substituir texto em uma string
1. Usando um comando externo (sed
):
$ text="casa azul"
$ result=$(echo "$text" | sed 's/azul/vermelha/')
$ echo $result
casa vermelha
Nesse caso:
echo
.
sed
, que precisa processar a entrada.
2. Usando expansão de parâmetros:
$ text="casa azul"
$ result=${text/azul/vermelha} # Substituição interna
$ echo $result
casa vermelha
Aqui:
Exemplo 2: Corte de extensão de arquivos
1. Usando comando externo (basename):
$ filename="meu_arquivo.txt"
$ result=$(basename "$filename" .txt)
$ echo $result
meu_arquivo
Envolve um processo para o basename
.
2. Usando expansão de parâmetros:
$ filename="meu_arquivo.txt"
$ result=${filename%.txt}
$ echo $result
meu_arquivo
Operação direta, em memória, sem criar processos.
Exemplo 3: Comparação de tempo com arrays grandes
Imagine processar um grande array de strings. Usar comandos externos para cada elemento pode ser muito mais lento do que usar expansão embutida.
Usando awk em um loop:
array=("um_nome.txt" "outro_arquivo.log" "teste.py") for file in "${array[@]}"; do echo "$file" | awk -F. '{ print $1 }' # Remove o sufixo done
Processo: A cada iteração, o loop cria um novo processo para `awk`. Isso leva tempo.
Usando expansão de parâmetros:
array=("um_nome.txt" "outro_arquivo.log" "teste.py") for file in "${array[@]}"; do echo "${file%.*}" # Remove o sufixo done
Processo: Aqui, o Bash faz tudo dentro mesmo do processo principal, sem criar processos extras.
Ganho Real de Performance
Embora o ganho exato dependa do sistema, do tamanho dos dados e da complexidade do script, benchmarks simples mostram diferenças claras. Considere o seguinte experimento:
Script Teste
Manipulando 100.000 strings para substituir uma substring.
#!/bin/bash # Teste com comando externo (sed) large_list=$(seq 1 100000 | xargs -I{} echo "string{} ") time { for item in $large_list; do echo "$item" | sed 's/string/text/' done }
Resultado: Leva vários segundos para processar.
#!/bin/bash # Teste com expansão de parâmetros large_list=$(seq 1 100000 | xargs -I{} echo "string{} ") time { for item in $large_list; do result=${item/string/text} # Substituição embutida done }
Resultado: Leva milissegundos no mesmo sistema.
A expansão de parâmetros é um recurso essencial no Bash, e o ganho de performance é especialmente visível quando:
Além do aumento de performance, o código baseado em expansões também se torna mais legível e portátil, reduzindo a complexidade de scripts. Portanto, sempre que possível, prefira a manipulação direta com expansões de parâmetros!
Para mergulhar fundo nas expansões de parâmetros e como utilizá-las, consulte os quatro artigos escritos pelo Prof. Julio Neves: