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/elsee instrucoescasecom sintaxe correta - Como funcionam os loops
for,whileeuntil, 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"
fiVerificacao 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"
fiOperadores 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."
;;
esacLoops
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"
doneLoop com Arrays
#!/bin/bash
fruits=("apple" "banana" "orange" "grape")
echo "Lista de frutas:"
for fruit in "${fruits[@]}"
do
echo "- $fruit"
doneLoop 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
doneLoop while
Loop while Basico
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "Iteracao do loop $count"
count=$((count + 1))
doneLendo 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"
fiLoop until
#!/bin/bash
count=1
until [ $count -gt 5 ]
do
echo "Contagem: $count"
count=$((count + 1))
doneControle 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"
doneErros 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_backupUse {} 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
fiMensagens 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