Dominando Parâmetros Posicionais: Um Guia para Argumentos de Script Bash
Scripts Bash ganham imenso poder e flexibilidade quando podem aceitar e processar entrada externa. Argumentos de linha de comando — dados passados para o script quando ele é executado — são a forma fundamental como os usuários interagem e personalizam ferramentas de automação. Dominar como o Bash lida com essas entradas é crucial para escrever scripts robustos, reutilizáveis e profissionais.
Este guia fornece uma visão geral abrangente de parâmetros posicionais, as variáveis especiais ($1, $2, $@, $#) usadas pelo Bash para acessar argumentos de linha de comando. Exploraremos os mecanismos de acesso a essas variáveis, diferenciaremos entre comportamentos importantes de aspas e implementaremos melhores práticas para validação e iteração de entrada.
A Anatomia dos Parâmetros Posicionais
Parâmetros posicionais são variáveis especiais definidas pelo shell que correspondem às palavras fornecidas na linha de comando após o nome do script. Eles são numerados sequencialmente, começando em 1.
| Parâmetro | Descrição | Valor de Exemplo (ao executar ./script.sh arquivo1 dir/) |
|---|---|---|
$0 |
O nome do próprio script (ou função). | ./script.sh |
$1 |
O primeiro argumento passado para o script. | arquivo1 |
$2 |
O segundo argumento passado para o script. | dir/ |
$N |
O N-ésimo argumento (onde N > 0). | |
${10} |
Argumentos além de 9 devem ser envolvidos em chaves. |
Acessando Argumentos Além de $9
Enquanto os argumentos de 1 a 9 são acessados diretamente como $1 a $9, acessar o décimo argumento e argumentos subsequentes requer envolver o número em chaves para evitar ambiguidade com variáveis de ambiente ou operações de string (por exemplo, ${10} em vez de $10).
Parâmetros Especiais Essenciais para Scripting
Além dos parâmetros numéricos, o Bash fornece várias variáveis especiais críticas que se relacionam com o conjunto de argumentos como um todo. Elas são indispensáveis para validação e iteração.
1. Contagem de Argumentos ($#)
A variável especial $# contém o número total de argumentos de linha de comando passados para o script (excluindo $0). Esta é talvez a variável mais importante para implementar validação de entrada.
#!/bin/bash
if [ "$#" -eq 0 ]; then
echo "Erro: Nenhum argumento fornecido."
echo "Uso: $0 <arquivo_entrada>"
exit 1
fi
echo "Você forneceu $# argumentos."
2. Todos os Argumentos ($@ e $*)
As variáveis $@ e $* representam a lista completa de argumentos, mas elas se comportam de maneira diferente — especialmente quando aspas são usadas.
$* (String Única)
Quando aspas duplas ("$*") são usadas, toda a lista de parâmetros posicionais é tratada como um único argumento, separado pelo primeiro caractere da variável IFS (Internal Field Separator) (geralmente um espaço).
- Se os argumentos de entrada forem:
arg1arg2arg3 "$*"se expande para:"arg1 arg2 arg3"(um único elemento)
$@ (Strings Separadas - Preferido)
Quando aspas duplas ("$@") são usadas, cada parâmetro posicional é tratado como um argumento separado e entre aspas. Este é o método padrão e preferido para iterar sobre argumentos, pois preserva corretamente argumentos contendo espaços.
- Se os argumentos de entrada forem:
arg1"arg com espaço"arg3 "$@"se expande para:"arg1" "arg com espaço" "arg3"(três elementos distintos)
Por que as Aspas Importam: Uma Demonstração
Considere um script executado com os argumentos: ./test.sh 'hello world' file.txt
#!/bin/bash
# Loop usando "$*" (Tratado como um elemento)
echo "-- Loop usando \$* (Divide incorretamente 'hello world') --"
for item in $*; do
echo "Item: $item"
done
# Loop usando "\$@" (Preserva corretamente os espaços)
echo "-- Loop usando "\$@" (Preserva os argumentos) --"
for item in "$@"; do
echo "Item: $item"
done
A saída de Item: hello e Item: world no primeiro loop demonstra por que "$@" é essencial.
Técnicas Práticas para Manipulação de Argumentos
1. Script Básico de Recuperação de Argumentos
Este script simples demonstra como acessar parâmetros específicos e usar $0 para fornecer feedback útil.
deploy_service.sh:
#!/bin/bash
# Uso: deploy_service.sh <nome_servico> <ambiente>
SERVICE_NAME="$1"
ENVIRONMENT="$2"
# Verificação de validação (mínimo de dois argumentos)
if [ "$#" -lt 2 ]; then
echo "Uso: $0 <nome_servico> <ambiente>"
exit 1
fi
echo "Iniciando implantação para o serviço: $SERVICE_NAME"
echo "Ambiente de destino: $ENVIRONMENT"
# Executa comando usando os parâmetros validados
ssh admin@server-"$ENVIRONMENT" "/path/to/start $SERVICE_NAME"
2. Validação Robusta de Entrada
Bons scripts sempre validam a entrada antes de prosseguir. Isso inclui verificar a contagem ($#) e frequentemente verificar o conteúdo dos argumentos (por exemplo, verificar se um argumento é um número ou um caminho de arquivo válido).
#!/bin/bash
# 1. Verifica Contagem de Argumentos (Deve ser exatamente 3)
if [ "$#" -ne 3 ]; then
echo "Erro: Este script requer três argumentos (origem, destino, usuário)."
echo "Uso: $0 <caminho_origem> <caminho_destino> <usuário>"
exit 1
fi
SRC_PATH="$1"
DEST_PATH="$2"
USER="$3"
# 2. Verifica Conteúdo (Exemplo: Verifica se o caminho de origem existe)
if [ ! -f "$SRC_PATH" ]; then
echo "Erro: Arquivo de origem '$SRC_PATH' não encontrado ou não é um arquivo."
exit 2
fi
# Se a validação passar, prossiga
echo "Copiando $SRC_PATH para $DEST_PATH como usuário $USER..."
Dica de Melhor Prática: Sempre forneça uma declaração
Usage:clara e concisa quando a validação falhar. Isso ajuda os usuários a corrigir rapidamente a invocação de seu comando.
3. Iterando Argumentos com shift
O comando shift é uma excelente ferramenta para processar argumentos sequencialmente, frequentemente usado ao lidar com flags simples ou ao processar argumentos um por um dentro de um loop while.
shift descarta o argumento $1 atual, move $2 para $1, $3 para $2, e decrementa $# em um. Isso permite que você processe o primeiro argumento e, em seguida, itere até que nenhum argumento reste.
#!/bin/bash
# Processa uma flag simples -v e depois lista os arquivos restantes
VERBOSE=false
if [ "$1" = "-v" ]; then
VERBOSE=true
shift # Descarta a flag -v e desloca os argumentos para cima
fi
if $VERBOSE; then
echo "Modo verboso ativado."
fi
if [ "$#" -eq 0 ]; then
echo "Nenhum arquivo especificado."
exit 0
fi
echo "Processando $# arquivos restantes:"
for file in "$@"; do
if $VERBOSE; then
echo "Verificando arquivo: $file"
fi
# ... lógica de processamento aqui
done
Nota: Enquanto
shifté útil para análise simples de argumentos, para scripts complexos envolvendo várias flags e opções (como-a,--help), ferramentas especializadas comogetopts(para opções curtas) ougetopt(para opções longas) são recomendadas.
Resumo e Próximos Passos
Parâmetros posicionais são a base de scripts Bash interativos e configuráveis. Ao utilizar corretamente $1, $2, $#, e mais criticamente, "$@", você garante que seus scripts possam manipular de forma confiável a entrada do usuário, incluindo argumentos que contêm espaços ou caracteres especiais.
Priorize sempre a validação de entrada usando $# no início do seu script para evitar falhas inesperadas posteriormente. Para aprendizado adicional, explore o comando embutido getopts para lidar com flags e opções de linha de comando profissionalmente, levando suas capacidades de processamento de argumentos para o próximo nível.