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"
fi

2. 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"
fi

3. 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))
done

4. 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
fi

6. 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))
done

7. 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
done

8. 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)"
fi

9. 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
done

11. 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
fi

Comandos Úteis do Shell e Suas Opções

Abaixo está uma lista de comandos essenciais do Shell, suas funções e opções mais úteis:

ComandoFunçãoOpções Úteis
catMostra arquivo-n, -s
cutExtrai campo-d, -f, -c
dateMostra data-d, +'...'
findEncontra arquivos-name, -iname, -type f, -exec
grepEncontra texto-i, -v, -r, -qs, -w, -x
headMostra Início-n, -c
printfMostra texto formatadoNenhuma
revInverte textoNenhuma
sedEdita texto-n, s/isso/aquilo/, d
seqConta Números-s, -f
sortOrdena texto-n, -f, -r, -k, -t, -o
tailMostra Final-n, -c, -f
trTransforma texto-d, -s, A-Z a-z
uniqRemove duplicatas-i, -d, -u
wcConta 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-10

Resultado:

root:x:0:0
operator:x

O 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

Entradas relacionadas: