Capítulo 6.3 - Estruturas de Controle
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Utilizar condições if/else
- Implementar loops for e while
- Utilizar case para seleção múltipla
- Compreender os operadores de teste
- Gerenciar erros
Condições if/else
Sintaxe Básica
#!/bin/bash
# if simples
if [ condição ]; then
comandos
fi
# if/else
if [ condição ]; then
comandos_se_verdadeiro
else
comandos_se_falso
fi
# if/elif/else
if [ condição1 ]; then
comandos1
elif [ condição2 ]; then
comandos2
else
comandos3
fi
Operadores de Teste
Arquivos:
[ -f arquivo ] # Arquivo existe e é regular
[ -d diretorio ] # Diretório existe
[ -e caminho ] # Caminho existe
[ -r arquivo ] # Legível
[ -w arquivo ] # Gravável
[ -x arquivo ] # Executável
[ -s arquivo ] # Não vazio
Strings:
[ -z "$VAR" ] # Vazio
[ -n "$VAR" ] # Não vazio
[ "$VAR1" = "$VAR2" ] # Igual
[ "$VAR1" != "$VAR2" ] # Diferente
Números:
[ $A -eq $B ] # Igual
[ $A -ne $B ] # Diferente
[ $A -lt $B ] # Menor
[ $A -le $B ] # Menor ou igual
[ $A -gt $B ] # Maior
[ $A -ge $B ] # Maior ou igual
Lógica:
[ condição1 ] && [ condição2 ] # E
[ condição1 ] || [ condição2 ] # OU
[ ! condição ] # NÃO
Exemplos
#!/bin/bash
# Verificar arquivo
if [ -f "/etc/passwd" ]; then
echo "Arquivo existe"
else
echo "Arquivo não existe"
fi
# Verificar usuário
if [ "$USER" = "root" ]; then
echo "Você é root"
elif [ "$UID" -eq 0 ]; then
echo "Você é root (por UID)"
else
echo "Você é $USER"
fi
# Condições múltiplas
if [ -f "$1" ] && [ -r "$1" ]; then
echo "Arquivo existe e é legível"
fi
Loop for
Sintaxe
#!/bin/bash
# Lista de valores
for item in valor1 valor2 valor3; do
echo "Item: $item"
done
# Percorrer argumentos
for arg in "$@"; do
echo "Argumento: $arg"
done
# Sequência numérica
for i in {1..10}; do
echo "Número: $i"
done
# Com incremento
for i in {1..10..2}; do
echo "Número: $i"
done
# Estilo C
for ((i=1; i<=10; i++)); do
echo "Número: $i"
done
Exemplos
#!/bin/bash
# Percorrer arquivos
for arquivo in *.txt; do
echo "Processando: $arquivo"
# Processamento...
done
# Percorrer diretórios
for dir in /home/*; do
if [ -d "$dir" ]; then
echo "Diretório: $dir"
fi
done
# Percorrer array
FRUTAS=("maçã" "banana" "laranja")
for fruta in "${FRUTAS[@]}"; do
echo "Fruta: $fruta"
done
Loop while
Sintaxe
#!/bin/bash
# while simples
while [ condição ]; do
comandos
done
# while com leitura
while read linha; do
echo "Linha: $linha"
done < arquivo.txt
# while infinito
while true; do
comandos
sleep 1
done
Exemplos
#!/bin/bash
# Contador
i=1
while [ $i -le 10 ]; do
echo "Número: $i"
i=$((i + 1))
done
# Ler arquivo linha por linha
while IFS= read -r linha; do
echo "Linha: $linha"
done < /etc/passwd
# Menu interativo
while true; do
echo "1. Opção 1"
echo "2. Opção 2"
echo "3. Sair"
read -p "Escolha: " escolha
case $escolha in
1) echo "Opção 1" ;;
2) echo "Opção 2" ;;
3) break ;;
*) echo "Escolha inválida" ;;
esac
done
Loop until
#!/bin/bash
# until (até que a condição seja verdadeira)
i=1
until [ $i -gt 10 ]; do
echo "Número: $i"
i=$((i + 1))
done
case - Seleção Múltipla
Sintaxe
#!/bin/bash
case $variavel in
pattern1)
comandos1
;;
pattern2)
comandos2
;;
pattern3|pattern4)
comandos3
;;
*)
comandos_padrao
;;
esac
Exemplos
#!/bin/bash
# Menu simples
read -p "Escolha (1-3): " escolha
case $escolha in
1)
echo "Opção 1 selecionada"
;;
2)
echo "Opção 2 selecionada"
;;
3)
echo "Opção 3 selecionada"
;;
*)
echo "Escolha inválida"
exit 1
;;
esac
# Patterns com wildcards
case "$1" in
start)
echo "Inicializando"
;;
stop)
echo "Parando"
;;
restart|reload)
echo "Reiniciando"
;;
*)
echo "Uso: $0 {start|stop|restart}"
exit 1
;;
esac
Controle de Fluxo
break e continue
#!/bin/bash
# break: Sair do loop
for i in {1..10}; do
if [ $i -eq 5 ]; then
break
fi
echo $i
done
# continue: Pular para a próxima iteração
for i in {1..10}; do
if [ $i -eq 5 ]; then
continue
fi
echo $i
done
exit
#!/bin/bash
# exit: Sair do script
if [ ! -f "$1" ]; then
echo "Erro: Arquivo não encontrado"
exit 1
fi
# Código de retorno
exit 0 # Sucesso
exit 1 # Erro geral
exit 2 # Erro específico
Exemplo Completo
#!/bin/bash
# Script de processamento de arquivos
# Verificar argumentos
if [ $# -eq 0 ]; then
echo "Uso: $0 ARQUIVO..."
exit 1
fi
# Processar cada arquivo
for arquivo in "$@"; do
# Verificar existência
if [ ! -f "$arquivo" ]; then
echo "Aviso: $arquivo não existe, ignorado"
continue
fi
# Verificar permissões
if [ ! -r "$arquivo" ]; then
echo "Erro: $arquivo não é legível"
continue
fi
# Processar conforme extensão
case "$arquivo" in
*.txt)
echo "Processando texto: $arquivo"
# Processamento...
;;
*.log)
echo "Processando log: $arquivo"
# Processamento...
;;
*)
echo "Tipo não suportado: $arquivo"
;;
esac
done
echo "Processamento concluído"
Resumo
Neste capítulo, você aprendeu:
if/else: Condições com operadores de teste
for: Loops com listas, sequências, arrays
while: Loops condicionais, leitura de arquivos
case: Seleção múltipla com patterns
Controle: break, continue, exit
Operadores: Arquivos, strings, números, lógica
Próximos Passos
Capítulo 6.4: Funções e Cron
Módulo 7: Rede e Configuração
Capítulo criado em: Dezembro 2024