Bash (Shell Script) 🐚
Este guia é um material de apoio para quem está começando em Bash (Bourne Again SHell), especialmente para estudantes que já possuem uma base em lógica de programação.
Bash é o shell padrão da maioria das distribuições Linux e do macOS — é tanto o interpretador de comandos que você usa no terminal quanto uma linguagem de script completa para automação: rodar sequências de comandos, processar arquivos, orquestrar outros programas.
Usado no projeto Saudações em Bash deste curso.
🛠️ Instalação e Configuração do Ambiente
Bash já vem instalado por padrão em Linux e macOS. No Windows, está disponível via WSL (Windows Subsystem for Linux) ou Git Bash.
Verifique a versão instalada:
bash --version
🚀 Seu Primeiro Programa em Bash
Crie um arquivo chamado:
ola.sh
Escreva:
#!/bin/bash
echo "Ola, Universo Bash!"
Dê permissão de execução e rode:
chmod +x ola.sh
./ola.sh
O resultado será:
Ola, Universo Bash!
Análise do Código
#!/bin/bashé o shebang — diz ao sistema operacional qual interpretador usar para rodar o arquivo.echoexibe texto no terminal.- Scripts Bash não precisam de compilação — são interpretados linha a linha.
📊 Variáveis
Bash não tem tipos declarados — tudo é tratado como texto por padrão, e convertido conforme o contexto usa.
nome="Ana Souza"
idade=25
salario=6200.75
echo "Nome: $nome" echo "Idade:$idade"
Importante: não pode haver espaço ao redor do = na atribuição (nome = "Ana" é um erro de sintaxe em Bash, seria interpretado como o comando nome com argumentos = e "Ana").
Para usar o valor de uma variável, prefixe com $ (ou ${nome} quando precisar deixar claro onde o nome termina).
🔢 Operadores
Aritméticos (dentro de (( )))
a=10
b=3
echo $((a + b)) echo$((a - b))
echo $((a * b)) echo$((a / b)) # divisão inteira
echo $((a % b))
Comparativos (para números, dentro de [[ ]] ou (( )))
| Operador | Significado |
|---|---|
-eq |
Igual |
-ne |
Diferente |
-lt |
Menor que |
-gt |
Maior que |
-le |
Menor ou igual |
-ge |
Maior ou igual |
if [[ $idade -ge 18 ]]; then
echo "Maior de idade"
fi
Dentro de (( )), também é possível usar os símbolos <, >, <=, >= diretamente, como no exemplo do projeto Saudações: (( hour < 6 )).
📤 Saída e 📥 Entrada de Dados
echo "Digite uma hora do dia (formato HH:MM): "
read input
echo "Você digitou: $input"
read lê uma linha do terminal e guarda na variável indicada.
🔀 Validação com Expressão Regular
O projeto Saudações em Bash valida o formato HH:MM com [[ ... =~ ... ]] (veja o tópico de Regex para entender a sintaxe do padrão):
if [[ ! $input =~ ^([01][0-9]|2[0-3]):([0-5][0-9])$ ]]; then
echo "Formato inválido! Por favor, digite no formato HH:MM."
exit 1
fi
=~ é o operador de “casa com regex” dentro de [[ ]]; ! na frente inverte a condição (executa o bloco se não bater com o padrão).
Extraindo partes de uma string
hour=$(echo $input | cut -d ":" -f 1)
minute=$(echo $input | cut -d ":" -f 2)
cut -d ":" -f 1 separa a string usando : como delimitador e pega o primeiro campo — a forma mais tradicional de “explode” em Bash. $(...) captura a saída de um comando numa variável.
🔀 Estrutura Condicional
if (( hour < 6 )); then
echo "Boa madrugada!"
elif (( hour < 12 )); then
echo "Bom dia!"
elif (( hour < 18 )); then
echo "Boa tarde!"
else
echo "Boa noite!"
fi
Repare no then obrigatório depois do if/elif, e no fi (o “if” ao contrário) fechando o bloco — um padrão que se repete em várias estruturas Bash (fi fecha if, done fecha do, esac fecha case).
🔀 Fluxo completo
flowchart TD
A("Início") --> B["Ler HH:MM com read"]
B --> C{"Bate com o padrao regex?"}
C -- Não --> E["Formato invalido!"]
C -- Sim --> F{"hour < 6?"}
F -- Sim --> G["Boa madrugada!"]
F -- Não --> H{"hour < 12?"}
H -- Sim --> I["Bom dia!"]
H -- Não --> J{"hour < 18?"}
J -- Sim --> K["Boa tarde!"]
J -- Não --> L["Boa noite!"]
G --> M("Fim")
I --> M
K --> M
L --> M
E --> M
style A fill:#cfc,stroke:#333,stroke-width:2px
style M fill:#f99,stroke:#333,stroke-width:2px
🔁 Estruturas de Repetição
# for
for i in 1 2 3 4 5; do
echo $i
done
# while
contador=0
while [[ $contador -lt 5 ]]; do echo$contador
contador=$((contador + 1))
done
📏 Arrays
numeros=(10 20 30 40)
echo ${numeros[0]} echo${numeros[@]} # todos os elementos
echo ${#numeros[@]} # tamanho do array
for n in "${numeros[@]}"; do echo$n
done
🧩 Funções
saudacao_por_hora() {
local hora=$1
if (( hora < 6 )); then
echo "Boa madrugada!"
elif (( hora < 12 )); then
echo "Bom dia!"
else
echo "Boa tarde!"
fi
}
saudacao_por_hora 8
$1 é o primeiro argumento passado à função (não existe lista de parâmetros nomeados como em outras linguagens); local restringe a variável ao escopo da função.
📝 Comentários
# Este é um comentário de uma linha
nome="Ana"
Bash não tem sintaxe nativa de comentário de múltiplas linhas — cada linha precisa do seu próprio #.
🐞 Depuração (Debugging)
bash -x script.sh
O modo -x (trace) imprime cada comando executado antes de rodá-lo, prefixado com + — extremamente útil para ver exatamente o valor das variáveis e o caminho que o script tomou.
⚠️ Erros Comuns de Iniciantes
Espaço ao redor do = na atribuição
nome = "Ana" # ERRO: Bash tenta executar o comando "nome"
nome="Ana" # Correto
Esquecer aspas ao redor de variáveis
if [[ $nome == "Ana Souza" ]] # pode quebrar se $nome tiver espaços
if [[ "$nome" == "Ana Souza" ]] # seguro
Sem aspas, o Bash faz word splitting — separa o valor da variável em várias palavras se houver espaços, o que pode quebrar comparações e comandos.
Confundir = (string) com -eq (número) em [[ ]]/[ ]
[[ "$idade" -eq 25 ]] # comparação numérica [[ "$idade" == "25" ]] # comparação de texto — funciona aqui, mas por coincidência
🧠 Bash x Linguagens de Propósito Geral
| Característica | Bash | C / Python / Java |
|---|---|---|
| Tipos | Tudo é texto por padrão | Tipos definidos (inteiro, string, etc.) |
| Uso principal | Automação, scripts de sistema | Aplicações completas |
| Execução | Interpretado, linha a linha | Compilado ou interpretado com runtime próprio |
| Aritmética | Precisa de (( )) ou expr |
Nativa |
| Portabilidade | Linux/macOS nativo, Windows via WSL | Multiplataforma nativamente |
🎓 Conclusão
Bash é a ferramenta certa quando o problema é orquestrar comandos — automatizar tarefas repetitivas, processar arquivos, encadear programas — em vez de construir uma aplicação completa. Compare com PowerShell, o equivalente moderno da Microsoft, que resolve os mesmos problemas com uma filosofia diferente (objetos em vez de texto puro).