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.
  • echo exibe 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).