Guia Prático de Shell Script: 12 Exemplos Essenciais em Bash
Classificado em Computação
Escrito em  em 
português com um tamanho de 13,57 KB
Scripts Essenciais em Bash: Guia Prático e Exemplos
1. Comparação de Números Inteiros (Maior, Menor, Igual)
Script que recebe dois números e imprime o resultado da comparação:
- 1 - Se o primeiro for maior que o segundo
 - 0 - Se os números forem iguais
 - -1 - Se o segundo for maior que o primeiro
 
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
echo "Digite N2: "
read n2
if [ $n1 -gt $n2 ]; then
    echo "1 -> O primeiro é maior"
fi
if [ $n1 -eq $n2 ]; then
    echo "0 -> Os números são iguais"
fi
if [ $n1 -lt $n2 ]; then
    echo "-1 -> O segundo é maior"
fi2. Comparação de Tamanho de Strings
Script que recebe duas strings e compara seus tamanhos:
- 1 - Se o tamanho da primeira for maior que o da segunda
 - 0 - Se as strings têm o mesmo tamanho
 - -1 - Se o tamanho da segunda for maior que o da primeira
 
Autor: Bruno T.
#!/bin/bash
# Script que recebe duas strings e imprime:
echo "Digite uma palavra: "
read n1
echo "Digite outra palavra: "
read n2
tamanho1=${#n1}
tamanho2=${#n2}
if [ $tamanho1 -gt $tamanho2 ]; then
    echo "1 -> A primeira é maior"
fi
if [ $tamanho1 -eq $tamanho2 ]; then
    echo "0 -> As strings têm o mesmo tamanho"
fi
if [ $tamanho1 -lt $tamanho2 ]; then
    echo "-1 -> A segunda é maior"
fi3. Contagem Regressiva e Progressiva com While
Script que faz contagem regressiva até zero e, em seguida, progressiva.
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
echo "Contagem regressiva: "
while [ $n1 -ge 0 ]; do
    echo "$n1"
    sleep 1
    if [ $n1 -eq 0 ]; then
        exit
    fi
    n1=$(($n1-1))
done
# Este bloco só será executado se o 'exit' acima for removido
while [ $n1 -le 0 ]; do
    echo "$n1"
    sleep 1
    n1=$(($n1+1))
done4. Encontrando a Posição de uma Substring
Script que mostra em que posição uma string aparece dentro da outra.
Autor: Bruno T.
#!/bin/bash
echo "Digite a primeira string: "
read n1
echo "Digite a segunda string: "
read n2
bt="#"
# Substitui a substring pela marcação '#'
n3=${n1/$n2/$bt}
# Usa 'expr index' para encontrar a posição da marcação
echo "A string $n2 aparece na string $n1 a partir da `expr index "$n3" "$bt"` posição"5. Cálculo de Média e Aprovação (Seleção das Duas Maiores Notas)
Script que, a partir de 3 notas, seleciona as duas maiores e verifica se o aluno foi aprovado (média das duas maiores >= 6, e ambas as notas >= 4).
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
echo "Digite N2: "
read n2
echo "Digite N3: "
read n3
# Caso N1 seja a menor nota (N1 <= N2 E N1 <= N3)
if [ $n1 -le $n2 ] && [ $n1 -le $n3 ] ; then
    # Verifica se as notas restantes (N2 e N3) são >= 4
    if [ $n2 -ge 4 ] && [ $n3 -ge 4 ] ; then
        soma=$(expr $n2 + $n3)
        media=$(expr $soma / 2)
        if [ $media -ge 6 ] ; then
            echo "Aluno aprovado com média $media"
        fi
    fi
fi
# Caso N2 seja a menor nota
if [ $n2 -le $n1 ] && [ $n2 -le $n3 ] ; then
    # Verifica se as notas restantes (N1 e N3) são >= 4
    if [ $n1 -ge 4 ] && [ $n3 -ge 4 ] ; then
        soma=$(expr $n1 + $n3)
        media=$(expr $soma / 2)
        if [ $media -ge 6 ] ; then
            echo "Aluno aprovado com média $media"
        fi
    fi
fi
# Caso N3 seja a menor nota
if [ $n3 -le $n2 ] && [ $n3 -le $n1 ] ; then
    # Verifica se as notas restantes (N2 e N1) são >= 4
    if [ $n2 -ge 4 ] && [ $n1 -ge 4 ] ; then
        soma=$(expr $n2 + $n1)
        media=$(expr $soma / 2)
        if [ $media -ge 6 ] ; then
            echo "Aluno aprovado com média $media"
        fi
    fi
fi6. Imprimindo Substrings Sequenciais
Script que imprime partes de uma string, aumentando o comprimento a cada iteração.
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
tamanho=${#n1}
contador=1
while [ "$contador" -le "$tamanho" ]; do
    # ${n1:0:$contador} extrai a substring do índice 0 até o contador
    echo "${n1:0:$contador}"
    contador=$(($contador+1))
done7. Encontrando Múltiplos de 13 (Loop For)
Script que mostra os múltiplos de 13 entre 1 e 300.
Autor: Bruno T.
#!/bin/bash
echo "Apresentando os múltiplos de 13 entre 1 e 300:"
for (( teste2=1; teste2 <= 300; teste2++ ))
do
    resto=$(expr $teste2 % 13)
    if [ $resto -eq 0 ]; then
        echo "$teste2"
    fi
done8. Cumprimento Personalizado por Horário
Script que cumprimenta o usuário de acordo com o horário atual (Bom dia, Boa tarde, Boa noite).
Autor: Bruno T.
#!/bin/bash
if [ "$(date +%k)" -ge 6 -a "$(date +%k)" -le 11 ] ; then
    echo "Bom dia $USER, Hoje é $(date +%a), dia $(date +%d) de $(date +%b) de $(date +%Y)"
elif [ "$(date +%k)" -ge 12 -a "$(date +%k)" -le 17 ] ; then
    echo "Boa tarde $USER, Hoje é $(date +%a), dia $(date +%d) de $(date +%b) de $(date +%Y)"
else
    echo "Boa noite $USER, Hoje é $(date +%a), dia $(date +%d) de $(date +%b) de $(date +%Y)"
fi9. Operações de Divisão (Quociente e Resto)
Script que recebe dois números e apresenta divisor, dividendo, resto e quociente em ambas as combinações.
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
echo "Digite N2: "
read n2
# Primeira combinação: N1 / N2
dividendo=$n1
divisor=$n2
resto=$(expr $dividendo % $divisor)
quociente=$(expr $dividendo / $divisor)
echo "Com $dividendo/$divisor, temos: "
echo "$quociente -> quociente"
echo "$resto -> resto"
# Segunda combinação: N2 / N1
dividendo=$n2
divisor=$n1
resto=$(expr $dividendo % $divisor)
quociente=$(expr $dividendo / $divisor)
echo "Com $dividendo/$divisor, temos: "
echo "$quociente -> quociente"
echo "$resto -> resto"10. Gerando Sequência Numérica (Soma dos Últimos Dois)
Script que calcula uma sequência de dez números baseada na soma dos dois últimos números digitados (similar à sequência de Fibonacci).
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
echo "Digite N2: "
read n2
echo "Sequência de soma dos dois últimos números a partir de $n1 $n2: "
for (( teste2=1; teste2 <= 10; teste2++ ))
do
    soma=$(expr $n1 + $n2)
    echo "$soma"
    # Atualiza os valores para a próxima iteração
    n1=$n2
    n2=$soma
done11. Formatando Data (Extração de Substrings)
Script que formata a apresentação da data a partir de uma entrada DD/MM/AAAA.
Autor: Bruno T.
#!/bin/bash
echo "Digite a data no formato DD/MM/AAAA: "
read n1
# Extração de substrings: ${variável:início:comprimento}
echo "Hoje é dia ${n1:0:2} do mês ${n1:3:2} de ${n1:6:4} "12. Verificando se um Número é Primo
Script que verifica se um número é primo ou não, listando seus divisores caso não seja.
Autor: Bruno T.
#!/bin/bash
echo "Digite N1: "
read n1
teste=1
divisores=0
# Conta quantos divisores o número possui
while [ "$teste" -le "$n1" ]; do
    resto=$(expr $n1 % $teste)
    if [ $resto -eq 0 ]; then
        divisores=$(($divisores+1))
    fi
    teste=$(($teste+1))
done
if [ $divisores -eq 2 ] ; then
    clear
    echo "$n1 É primo!!!"
else
    clear
    echo "$n1 Não é primo, pois possui os seguintes divisores: "
    # Lista os divisores
    teste=1
    while [ "$teste" -le "$n1" ]; do
        resto=$(expr $n1 % $teste)
        if [ $resto -eq 0 ]; then
            # Aqui, 'divisores' está sendo usado para armazenar o quociente, o que é confuso, mas mantém a lógica original de listar os divisores.
            divisores=$(expr $n1 / $teste)
            echo "$divisores"
        fi
        teste=$(($teste+1))
    done
fiComandos Úteis do Shell e Suas Opções
Abaixo está uma lista de comandos essenciais do Shell, suas funções e opções mais úteis:
| Comando | Função | Opções Úteis | 
|---|---|---|
cat | Mostra arquivo | -n, -s | 
cut | Extrai campo | -d, -f, -c | 
date | Mostra data | -d, +'...' | 
find | Encontra arquivos | -name, -iname, -type f, -exec | 
grep | Encontra texto | -i, -v, -r, -qs, -w, -x | 
head | Mostra Início | -n, -c | 
printf | Mostra texto formatado | Nenhuma | 
rev | Inverte texto | Nenhuma | 
sed | Edita texto | -n, s/isso/aquilo/, d | 
seq | Conta Números | -s, -f | 
sort | Ordena texto | -n, -f, -r, -k, -t, -o | 
tail | Mostra Final | -n, -c, -f | 
tr | Transforma texto | -d, -s, A-Z a-z | 
uniq | Remove duplicatas | -i, -d, -u | 
wc | Conta Letras/Palavras/Linhas | -c, -w, -l, -L | 
Use man comando ou comando --help para obter mais informações sobre cada um deles.
Combinando Comandos com Pipe (|)
Em shell, é possível combinar comandos, aplicando-os em sequência, para formar um comando completo. Usando o pipe (|), é possível canalizar a saída de um comando diretamente para a entrada de outro, fazendo uma cadeia de comandos.
Exemplo:
prompt$ cat /etc/passwd | grep root | cut -c1-10Resultado:
root:x:0:0
operator:xO cat mostra o arquivo todo, o grep pega essa saída e extrai apenas as linhas que contêm a palavra "root" e o cut, por sua vez, somente nessas linhas que o grep achou, extrai os 10 primeiros caracteres. Isso funciona como uma estação de tratamento de água, onde ela entra suja, vai passando por vários filtros que vão tirando as impurezas e sai limpa no final.
Redirecionamento de Saída (>)
É possível redirecionar a saída de um comando para um arquivo ao invés da tela, usando o operador >. Para guardar a saída do comando anterior no arquivo "saida", basta fazer:
prompt$ cat /etc/passwd | grep root | cut -c1-10 > saida
prompt$ cat saida
root:x:0:0
operator:x
prompt$Cuidado! Shell é tão legal que vicia!
O Comando 'test' e Expressões Condicionais
O canivete suíço dos comandos do shell é o test, que consegue fazer vários tipos de testes em números, textos e arquivos. Ele possui várias opções para indicar que tipo de teste será feito:
Testes em Variáveis (Números e Strings)
-lt: Número é menor que (Less Than)-gt: Número é maior que (Greater Than)-le: Número é menor ou igual (Less Equal)-ge: Número é maior ou igual (Greater Equal)-eq: Número é igual (EQual)-ne: Número é diferente (Not Equal)=: String é igual!=: String é diferente-n: String é não nula (tem comprimento maior que zero)-z: String é nula (tem comprimento zero)
Testes em Arquivos e Lógica
-d: É um diretório-f: É um arquivo normal-r: O arquivo tem permissão de leitura-s: O tamanho do arquivo é maior que zero-w: O arquivo tem permissão de escrita-nt: O arquivo é mais recente (Newer Than)-ot: O arquivo é mais antigo (Older Than)-ef: O arquivo é o mesmo (Equal File)-a: E lógico (AND)-o: OU lógico (OR)
Fonte: Introdução ao Shell Script - Aurélio Marinho Jargas
Sintaxe de Aritmética e Exemplo de Loop
A construção usada para indicar uma expressão aritmética é $((...)), com dois parênteses.
O mesmo pode ser feito com o while, usando um contador:
i=0
while test $i -le 10
do
    i=$((i+1))
    echo "Contando: $i"
done