Tutorial de Shell Script para Iniciantes - Variaveis, If e Loops no Bash

Tutorial de Shell Script para Iniciantes - Variaveis, If e Loops no Bash

Shell scripting e uma ferramenta poderosa para automatizar tarefas em sistemas Linux. Nesta edicao de fundamentos, voce vai aprender a sintaxe de scripts Bash desde variaveis e condicionais ate loops, com exemplos praticos ao longo do caminho.

O Que Voce Vai Aprender

  • Como criar e executar seu primeiro script Bash com a linha shebang e permissao de execucao
  • Como definir variaveis, usar variaveis especiais e aceitar entrada do usuario com read
  • Como escrever condicionais if/elif/else e instrucoes case com sintaxe correta
  • Como funcionam os loops for, while e until, incluindo processamento de arquivos e controle de loop
  • Os seis erros mais comuns de iniciantes e como evita-los

Seu Primeiro Shell Script

Conclusao: #!/bin/bash, chmod +x, ./script.sh -- tres passos que iniciam todo script Bash.

Estrutura Basica

#!/bin/bash
# Isso e um comentario

echo "Ola, Shell Script!"
echo "Data/hora atual: $(date)"
echo "Nome de usuario: $USER"

Criando e Executando Scripts

Passo 1: Criar Arquivo

$ nano hello.sh

Digite o codigo acima e salve.

Passo 2: Adicionar Permissao de Execucao

$ chmod +x hello.sh

Passo 3: Executar Script

$ ./hello.sh
Ola, Shell Script!
Data/hora atual: Mon Jan 11 14:30:00 JST 2025
Nome de usuario: user

Sobre o Shebang

#!/bin/bash e chamado de shebang e especifica o interpretador para executar este arquivo.

  • #!/bin/bash -- Usar Bash
  • #!/bin/sh -- Usar shell POSIX
  • #!/usr/bin/env bash -- Auto-detectar do ambiente

Variaveis e Entrada

Conclusao: Sem espacos ao redor do =; entre aspas todos os usos; use $() para substituicao; read -p para entrada.

Fundamentos de Variaveis

#!/bin/bash

# Definir variaveis (sem espacos ao redor do =)
name="Usuario Linux"
age=25
today=$(date +%Y-%m-%d)

# Usar variaveis
echo "Nome: $name"
echo "Idade: ${age} anos"
echo "Data de hoje: $today"

Exemplo de Calculo

#!/bin/bash

num1=10
num2=3

sum=$((num1 + num2))
diff=$((num1 - num2))
product=$((num1 * num2))
quotient=$((num1 / num2))

echo "Adicao: $num1 + $num2 = $sum"
echo "Subtracao: $num1 - $num2 = $diff"
echo "Multiplicacao: $num1 x $num2 = $product"
echo "Divisao: $num1 / $num2 = $quotient"

Variaveis Especiais

Variavel Descricao Exemplo
$0 Nome do script ./script.sh
$1, $2, ... Argumentos da linha de comando 1o arg, 2o arg
$# Numero de argumentos 3 para 3 argumentos
$@ Todos os argumentos "arg1" "arg2" "arg3"
$? Status de saida do ultimo comando 0 para sucesso, nao-0 para falha
$$ ID do processo atual 12345
$USER Nome de usuario atual user
$HOME Diretorio home /home/user
$PWD Diretorio atual /home/user/scripts

Entrada do Usuario

Entrada Basica

#!/bin/bash

echo "Por favor, digite seu nome:"
read name
echo "Ola, ${name}!"

Entrada com Prompt

#!/bin/bash

read -p "Digite sua idade: " age
read -s -p "Digite a senha: " password
echo
echo "Idade: $age"
echo "Senha digitada silenciosamente"

Multiplos Valores de Uma Vez

#!/bin/bash

echo "Digite nome e idade (separados por espaco):"
read name age
echo "Nome: $name, Idade: $age"

Condicionais

Conclusao: Espacos dentro de [ ] obrigatorios; variaveis de string entre aspas; use -eq/-gt/-lt para numeros.

Instrucao if

Instrucao if Basica

#!/bin/bash

read -p "Digite um numero: " num

if [ "$num" -gt 0 ]; then
    echo "$num e positivo"
elif [ "$num" -lt 0 ]; then
    echo "$num e negativo"
else
    echo "$num e zero"
fi

Verificacao de Existencia de Arquivo

#!/bin/bash

filename="test.txt"

if [ -f "$filename" ]; then
    echo "$filename existe"
    echo "Tamanho do arquivo: $(wc -c < "$filename") bytes"
else
    echo "$filename nao existe"
    echo "Criando arquivo..."
    touch "$filename"
fi

Operadores Condicionais

Comparacao Numerica

Operador Significado Exemplo
-eq Igual [ $a -eq $b ]
-ne Diferente [ $a -ne $b ]
-gt Maior que [ $a -gt $b ]
-ge Maior ou igual [ $a -ge $b ]
-lt Menor que [ $a -lt $b ]
-le Menor ou igual [ $a -le $b ]

Comparacao de Strings

Operador Significado Exemplo
= Igual [ "$a" = "$b" ]
!= Diferente [ "$a" != "$b" ]
-z String vazia [ -z "$str" ]
-n Nao vazia [ -n "$str" ]

Testes de Arquivo

Operador Significado Exemplo
-f Arquivo regular [ -f file.txt ]
-d Diretorio [ -d /home ]
-e Existe [ -e path ]
-r Legivel [ -r file ]
-w Gravavel [ -w file ]
-x Executavel [ -x script ]

Instrucao case

#!/bin/bash

echo "Selecione uma opcao:"
echo "1) Listar arquivos"
echo "2) Mostrar hora atual"
echo "3) Mostrar info do sistema"
echo "4) Sair"

read -p "Escolha (1-4): " choice

case $choice in
    1)
        echo "=== Lista de Arquivos ==="
        ls -la
        ;;
    2)
        echo "=== Hora Atual ==="
        date
        ;;
    3)
        echo "=== Info do Sistema ==="
        uname -a
        ;;
    4)
        echo "Saindo."
        exit 0
        ;;
    *)
        echo "Escolha invalida."
        ;;
esac

Loops

Conclusao: {1..N} para intervalos, while IFS= read para linhas de arquivo, until para condicoes inversas.

Loop for

Loop for Basico

#!/bin/bash

# Intervalo numerico
for i in {1..5}
do
    echo "Contagem: $i"
done

echo "---"

# Processamento de arquivos
for file in *.txt
do
    echo "Processando: $file"
    wc -l "$file"
done

Loop com Arrays

#!/bin/bash

fruits=("apple" "banana" "orange" "grape")

echo "Lista de frutas:"
for fruit in "${fruits[@]}"
do
    echo "- $fruit"
done

Loop for Estilo C

#!/bin/bash

echo "Tabela de multiplicacao (parcial):"
for ((i=1; i<=5; i++))
do
    for ((j=1; j<=5; j++))
    do
        result=$((i * j))
        printf "%2d " $result
    done
    echo
done

Loop while

Loop while Basico

#!/bin/bash

count=1
while [ $count -le 5 ]
do
    echo "Iteracao do loop $count"
    count=$((count + 1))
done

Lendo Arquivos

#!/bin/bash

filename="data.txt"

if [ -f "$filename" ]; then
    while IFS= read -r line
    do
        echo "Lido: $line"
    done < "$filename"
else
    echo "Arquivo $filename nao encontrado"
fi

Loop until

#!/bin/bash

count=1
until [ $count -gt 5 ]
do
    echo "Contagem: $count"
    count=$((count + 1))
done

Controle de Loop

  • break -- Sair do loop
  • continue -- Pular para a proxima iteracao
#!/bin/bash

for i in {1..10}
do
    if [ $i -eq 3 ]; then
        echo "Pulando 3"
        continue
    fi

    if [ $i -eq 8 ]; then
        echo "Parando em 8"
        break
    fi

    echo "Numero: $i"
done

Erros Comuns de Iniciantes e Armadilhas

Conclusao: Seis armadilhas em scripts Bash: espacamento, chaves, colchetes, aspas, crases, matematica.

Erro 1: Espacos na Atribuicao de Variavel

NG (causa erro)

name = "Taro"     # Espaco antes/depois do =
age= 25          # Espaco depois do =
city ="Tokyo"     # Espaco antes do =

Resulta em erro "command not found".

OK (uso correto)

name="Taro"      # Sem espacos ao redor do =
age=25
city="Tokyo"

A atribuicao de variavel nao pode ter espacos ao redor do =.

Erro 2: Chaves Ausentes na Referencia de Variavel

NG (resultados inesperados)

filename="test"
echo "$filenameback.txt"    # Vazio
echo "$filename_backup"     # Vazio

OK (uso correto)

filename="test"
echo "${filename}back.txt"   # testback.txt
echo "${filename}_backup"    # test_backup

Use {} para definir claramente o escopo do nome da variavel.

Erro 3: Espacos Ausentes nas Condicoes do if

NG (erro de sintaxe)

if [$num -gt 5]; then       # Sem espaco depois do [
if [ $num -gt 5]; then      # Sem espaco antes do ]

OK (uso correto)

if [ $num -gt 5 ]; then     # Espacos dentro de [ ] obrigatorios
if [[ $num -gt 5 ]]; then   # Mesmo para [[ ]]
if (( num > 5 )); then      # Expressao aritmetica

Erro 4: Aspas Ausentes na Comparacao de Strings

NG (exemplos perigosos)

if [ $name = John Doe ]; then    # Problemas com espacos
if [ $empty_var = "" ]; then     # Erro quando vazio

OK (uso seguro)

if [ "$name" = "John Doe" ]; then    # Aspas em ambos os lados
if [ "$empty_var" = "" ]; then       # Sem erro quando vazio
if [ -z "$var" ]; then               # Opcao dedicada para verificar vazio

Erro 5: Sintaxe Antiga de Substituicao de Comando

NG (nao recomendado)

date=`date`                 # Crases
result=`cat `which ls``     # Aninhamento causa erro

OK (sintaxe moderna)

date=$(date)                # Use $()
result=$(cat $(which ls))   # Facil de aninhar

Erro 6: Erros de Operacao Aritmetica

NG (nao calculado)

result = $num1 + $num2      # Interpretado como comando "result" (command not found)
sum="$a + $b"               # Nao calculado

OK (metodos corretos de calculo)

result=$((num1 + num2))     # Expansao aritmetica
let "result = num1 + num2"  # Usar comando let

Regras Basicas para Prevenir Erros

Fundamentos de Escrita

  • Atribuicao de variavel: sem espacos ao redor do =
  • Uso de variavel: sempre entre aspas "$var"
  • Variaveis complexas: use chaves "${var}"

Fundamentos de Condicionais

  • Usando [ ]: sempre inclua espacos internos
  • Comparacao de strings: aspas em ambos os lados
  • Comparacao numerica: use -eq, -gt, -lt, etc.

Depuracao e Solucao de Problemas

#!/bin/bash

# Habilitar modo de depuracao
set -x              # Exibir execucao de comandos
set -e              # Parar em erro
set -u              # Erro em variaveis indefinidas

# Verificar conteudo da variavel
echo "DEBUG: var = [$var]"

# Verificar existencia do arquivo
if [ ! -f "$filename" ]; then
    echo "ERRO: Arquivo $filename nao encontrado" >&2
    exit 1
fi

Mensagens de Erro Comuns e Solucoes

  • "command not found": Espacos desnecessarios na atribuicao de variavel, permissao de execucao ausente --> chmod +x script.sh
  • "syntax error": Espacos ausentes dentro de [ ] na instrucao if, aspas incompativeis, palavras-chave ausentes (then, fi, done)
  • "Permission denied": Sem permissao de execucao --> chmod +x script.sh

Proximas Leituras