No Shell do Linux, variáveis são fundamentais para armazenar dados, controlar fluxo e interagir com o sistema. Este guia aborda os principais tipos de variáveis, desde posicionais até arrays, com exemplos práticos e boas práticas.
Variáveis Posicionais
Essas variáveis representam os argumentos passados na linha de comando para um script. Veja os principais:
#!/bin/bash
# Nome do script
echo "Script: $0"
# Quantidade de argumentos
echo "Args: $#"
# Primeiro argumento
echo "Arg1: $1"
# Todos os argumentos (como string única)
echo "\$*: $*"
# Todos os argumentos (como lista separada)
echo "\$@: $@"
Diferença entre $* e $@: Quando entre aspas duplas, $* trata todos os argumentos como uma única string, enquanto $@ os mantém como elementos separados (útil em loops).
Exercício prático – Validar número de argumentos:
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Uso: $0 arg1 arg2"
exit 1
fi
echo "Argumentos: $1 e $2"
Variáveis de Status
A variável $? armazena o código de retorno do último comando executado. 0 indica sucesso, qualquer outro valor indica erro.
Exemplo de uso em backup:
#!/bin/bash
mv documento.txt backup/
retorno=$?
if [ $retorno -eq 0 ]; then
echo "Movimentação bem-sucedida."
else
echo "Falha ao mover o arquivo."
fi
echo "Código de retorno: $retorno"
Variáveis Especiais: Expansão com Valor Padrão
O Shell oferece operadores para definir valores padrão ou verificar existência de variáveis. Os mais comuns são:
${var:-padrao}– Usa padrao sevarnão existir ou for nulo (com:).${var:=padrao}– Atribui padrao avarse ela não existir ou for nula.${var:+novo}– Usa novo sevarexistir e não to nula.${var:?mensagem}– Exibe mensagem e termina o script sevarnão existir ou for nula.
Exemplo prático:
#!/bin/bash
echo "var não definida: ${var:-fallback}"
echo "var após := : ${var:=valorAtribuido}"
echo "var agora: $var"
echo "substituição com +: ${var:+SUBSTITUIDO}"
unset var
echo "teste com ?: ${var:?ERRO: variável necessária}"
Aplicação empresarial – Usar ${path:-/tmp} em comandos de exclusão para evitar operações em diretórios inexistentes:
find ${camino:-/tmp} -name "*.log" -mtime +7 -exec rm {} \;
Substrings de Variáveis
O Shell permite extrair porções de strings e calcular comprimentos. Sintaxe básica:
| Operação | Sintaxe | Exemplo |
|---|---|---|
| Comprimento | ${#var} |
${#nome} → 5 se nome="Maria" |
| Extrair substring | ${var:posição:comprimento} |
${texto:2:3} |
| Remover prefixo curto | ${var#padrão} |
${arquivo#*.} |
| Remover sufixo curto | ${var%padrão} |
${arquivo%.*} |
Exemplo de uso:
#!/bin/bash
frase="Olá mundo Linux"
echo "Tamanho: ${#frase}"
echo "Fatia (0,3): ${frase:0:3}"
echo "Remover primeiro 'Linux': ${frase#Linux}"
echo "Remover último 'mundo': ${frase%mundo}"
Formas de Atribuição de Variáveis
Existem três métodos principais:
- Direta:
nome="João" - Por argumento:
a=$1(recebe o primeiro parâmetro do script) - Via comando
read: ``` #!/bin/bash read -t 10 -p "Digite sua idade: " idade echo "Idade informada: $idade"
Exemplo empresarial com read – Menu interativo:
#!/bin/bash
cat <<EOF
1. Instalar Apache
2. Instalar Nginx
3. Sair
EOF
read -p "Escolha uma opção: " opcao
# Valida se é número
expr $opcao + 1 >/dev/null 2>&1
if [ $? -ne 0 ] || [ -z "$opcao" ]; then
echo "Opção inválida! Use números."
exit 1
fi
case $opcao in
1) echo "Instalando Apache...";;
2) echo "Instalando Nginx...";;
3) echo "Saindo..."; exit;;
*) echo "Opção inválida!"; exit 1;;
esac
Arrays no Shell
Arrays permitem armazenar múltiplos valores em uma única variável. São indexados a partir de 0.
Declaração estática:
# Método 1 (recomendado)
frutas=("maçã" "banana" "laranja")
# Método 2 (com índices explícitos)
animais=([0]="cachorro" [1]="gato" [2]="pássaro")
Declaração dinâmica (com saída de comandos):
arquivos=($(ls *.txt))
# ou
arquivos=(`ls *.txt`)
Acessando elementos:
echo "${frutas[@]}" # Todos os elementos
echo "${#frutas[@]}" # Quantidade de elementos
echo "${frutas[1]}" # Segundo elemento (índice 1)
Modificando o array:
frutas[3]="uva" # Adiciona novo elemento
frutas[0]="morango" # Substitui o primeiro
unset frutas[1] # Remove o segundo elemento
unset frutas # Remove o array inteiro
Fatiamento e substituição (funciona como substring):
cores=("vermelho" "azul" "verde" "amarelo")
echo "${cores[@]:1:2}" # "azul verde" (a partir do índice 1, 2 elementos)
echo "${cores[@]/verde/roxo}" # Substitui "verde" por "roxo" (não altera original)
Exemplo prático – Filtrar palavras com até 6 caracteres:
#!/bin/bash
palavras=("eu" "sou" "um" "exemplo" "de" "shell")
echo "Palavras com ≤6 letras:"
for p in "${palavras[@]}"; do
if [ ${#p} -le 6 ]; then
echo "$p"
fi
done
# Alternativa usando for com índice
echo "---------------"
for (( i=0; i<${#palavras[@]}; i++ )); do
if [ ${#palavras[i]} -le 6 ]; then
echo "${palavras[i]}"
fi
done