Algoritmos em Shell Script

Abordando de forma conceitual e prática, a construção de algoritmos através de Shell Script.

[ Hits: 48.896 ]

Por: Wagner Souza em 20/06/2014 | Blog: https://medium.com/@souzaw


Estrutura de seleção



Uma estrutura de seleção, permite a escolha de um grupo de ações a serem executadas quando determinada condição for satisfeita.

Em shell, utiliza-se o if, test e/ou case. O elemento test pode ser substituído por if [ condição ]. O if é bastante conhecido em outras linguagens de programação, bem como o case.

Estrutura do if:

if [ condição ]
then
   < sequência de comandos >
fi

O comando if irá testar se a condição é verdadeira, caso sim, então (then), execute a sequência de comandos. A estrutura de seleção do if encerra com o fi.

É possível informar o que será feito, caso uma condição seja falsa:

if [ condição ]; then
   < sequência de comandos >
   else
      < sequência de comandos >
fi

No exemplo anterior, caso a condição não seja verdadeira, será executado um outro bloco de comandos diferente do primeiro exemplo que não executaria nada, caso a condição fosse falsa.

Outro ponto a ser observado, é que o then está na primeira linha, junto com a condição. Isso é possível por meio do caractere ; que permite executar comandos em sequência.

Algoritmo 006:

#!/bin/bash
#Autor: k666
#Data: 20/07/2013
#Algoritmo que informa se o número é impar ou par
#O número será ímpar se o resto da divisão por 2 for igual a 1
#se for 0, o número é par.



echo "Digite um número:  "
read num

#Efetuei o cálculo que retorno o resto da divisão de um número com
#o operador %. Atribuir o nome a variável de mod referente a modular (%)
#o if testa apenas variáveis por isso fiz o cálculo antes até por questão de organização


mod=$(($num%2))

if [ $mod -eq 1 ]
then
  echo "O número $num é impar!"
   else
    echo "O número $num é par!"
fi

Abaixo, o mesmo algoritmo, porém, utilizando o comando test. O resultado final será o mesmo.

Algoritmo 006.1:

#!/bin/bash
#Autor: k666
#Data: 20/07/2013
#Algoritmo que informa se o número é impar ou par
#O número será ímpar se o resto da divisão por 2 for igual a 1
#se for 0, o número é par.



echo "Digite um número:  "
read num


mod=$(($num%2))

if test $mod -eq 1
then
  echo "O número $num é impar!"
   else
    echo "O número $num é par!"
fi

Algoritmo 007:

#!/bin/bash #Autor: k666 #Data: 20/07/2013 #Algoritmo que recebe três números e os escreve em ordem crescente #e informar se estes são iguais



echo "Digite um número: " read num1

echo "Digite o segundo número: " read num2

echo "Digite o terceiro número: " read num3

#Serão seis possibilidades possíveis para determinar qual
#número é maior que o outro. Aqui estou usando operadores relacionais
#-gt (maior que) e  -a (and que é o e lógico)


if [ $num1 -gt $num2 -a $num1 -gt $num3 -a $num2 -gt $num3 ]
then
  echo "Os números em ordem crescente são: $num3, $num2 e $num1"
   elif [ $num2 -gt $num1 -a $num2 -gt $num3 -a $num1 -gt $num3 ]
then
      echo "Os números em ordem crescente são: $num3, $num1 e $num2"
       elif [ $num3 -gt $num1 -a $num3 -gt $num2 -a $num1 -gt $num2 ]
then
         echo "Os números em ordem crescente são: $num2, $num1 e $num3"
          elif [ $num1 -gt $num2 -a $num1 -gt $num3 -a $num3 -gt $num2 ]
then
           echo "Os números em ordem crescente são: $num2, $num3 e $num1"
            elif [ $num2 -gt $num1 -a $num2 -gt $num3 -a $num3 -gt $num1 ]
then
             echo "Os números em ordem crescente são: $num1, $num3 e $num2"
              elif [ $num3 -gt $num1 -a $num3 -gt $num2 -a $num2 -gt $num1 ]
then
               echo "Os números em ordem crescente são: $num1, $num2 e $num3"
                else
                 echo "Os números são iguais"
fi

Algoritmo 008:

#!/bin/bash
#Autor: k666
#Data: 13/07/2013
#Algoritmo que recebe três notas fornecidas pelo usuário e calcula a média final
#e informa se o aluno foi aprovado ou reprovado com a média com duas
#casas decimais

#Os valores das duas variáveis abaixo estão entre crases
#O comando date, sleep e clear fazem parte do sistema GNU/Linux
#O comando date retorna a data e hora atual do sistema. Aqui
#foi utilizado o comando date para retornar separadamente o
#dia (%d), mês (%m), ano (%Y - quatro dígitos) e hora (%T - time)


data=`date +%d/%m/%Y`
hora=`date +%T`

echo "___________________________"

echo "Data atual: $data"
echo "Hora atual: $hora"

#O comando echo sem argumentos, permite pular uma linha
echo
echo -e "CALCULA MÉDIA 2013"
echo

#$USER é uma variável predefinida do sistema que exibe o usuário atual logado no sistema

echo "Bem-vindo usuário $USER"

echo "___________________________"


#Realiza uma pausa de 3 segundos, ou mais você é que define,
#antes de executar o próximo comando


echo
echo "Informe o nome do aluno: "
read nome
echo "Digite a primeira nota  "
read nota1
echo "Digite a segunda nota  "
read nota2
echo "Digite a terceira nota  "
read nota3

#A variável media será utilizada para utilizar seu conteúdo
#na estrutura de decisão. O programa bc é utilizado como uma
#calculadora matemática onde o valor da variável é canalizado
#pelo pipe ( | ) para o bc e em seguida para o comando cut.
#O cut recorta uma informação que neste caso é um caractere
#com o parâmetro -c que pega apenas o primeiro para ser feito
#o teste condicional (if) já que este não aceita valores decimais


media=$(echo "scale=2;($nota1+$nota2+$nota3)/3" | bc -l | cut -c1)

#mf é a média final com o cálculo com as duas casas decimais como
#proposto no algoritmo


mf=$(echo "scale=2;($nota1+$nota2+$nota3)/3" | bc -l)


if [ $media -ge 7 ]; then
echo "O aluno $nome está aprovado! Média final: $mf"
  else
   echo "O aluno $nome está reprovado. Média Final: $mf"
fi

Uma outra estrutura de seleção, é o case. A sua utilização é muito útil quando trabalhamos com múltiplas escolhas, como menus. Nos exemplos abaixo, essa compreensão ficará mais fácil de entender.

Estrutura do comando case:

case $var in
        padrao1) cmd1
                 cmd2
                 cmdn ;;
        padrao2) cmd1
                 cmd2
                 cmdn ;;
        padraon) cmd1
                 cmd2
                 cmdn ;;
    esac

Algoritmo 009 [3]:

#!/bin/bash
#Autor: k666
#Data: 13/07/2013
#Algoritmo que quando executado informa as seguintes saudações: Bom dia, Boa tarde ou Boa noite.
#Além disso, informar a saudação junto com o nome do usuário

#O comando date foi formatado de tal forma afim de pegar a penas a hora e não o minuto. Ex.: Suponha que seja 08:30, com o comando abaixo, só será obtido o 08


hora=$(date +%H)

#Entendendo as condições para a saudação:
#0? | 1[01] - Significa zero seguido de qualquer coisa (?), ou (|) um seguido de zero ou um ([01]) ou seja, esta linha pegou 01, 02, ... 09, 10 e 11;
#1[2-7]     - Significa um seguido da lista de dois a sete, ou seja, esta linha pegou 12, 13, ... 17;
#*          - Significa tudo que não casou com nenhum dos padrões anteriores.


case $hora in
    0? | 1[01]) echo "Bom Dia $USER"
                ;;
    1[2-7]    ) echo "Boa Tarde $USER"
                ;;
    *         ) echo "Boa Noite $USER"
                ;;
esac
exit

Algoritmo 010:

#!/bin/bash
#Autor: k666
#Data: 14/01/2014
#Algoritmo que disponibilize uma lista de escolha para o usuário poder procurar, instalar ou remover
#um pacote de software para o sistema Debian


echo "Escolha uma das opções abaixo: "
echo " (1) Procurar um pacote "
echo " (2) Instalar um pacote "
echo " (3) Remover um pacote "
read op

#Logo abaixo são apresentados os comandos para realizar as tarefas de procurar, instalar e remover pacotes
#no sistema Linux Debian


case $op in
       1 ) echo -n "Informe o nome do pacote: "
       read pkg
       apt-cache search $pkg
        ;;
       2 ) echo -n "Informe o nome do pacote: "
           read pkg
       apt-get install $pkg
        ;;
      3 )  echo -n "Informe o nome do pacote: "
       read pkg
       apt-get remove $pkg
                ;;
      * ) echo "Opção Inválida"
esac
exit

Algoritmo 010.1:

#!/bin/bash
#Autor: k666
#Data: 14/01/2014
#Algoritmo que disponibilize uma lista de escolha para o usuário poder procurar, instalar ou remover
#um pacote de software para o sistema Red Hat


echo "Escolha uma das opções abaixo: "
echo " (1) Procurar um pacote "
echo " (2) Instalar um pacote "
echo " (3) Remover um pacote "
read op

#Logo abaixo são apresentados os comandos para realizar as tarefas de procurar, instalar e remover pacotes
#no sistema Linux Red Hat


case $op in
       1 ) echo -n "Informe o nome do pacote: "
       read pkg
       yum search $pkg
        ;;
       2 ) echo -n "Informe o nome do pacote: "
           read pkg
       yum install $pkg
        ;;
      3 )  echo -n "Informe o nome do pacote: "
       read pkg
       yum remove $pkg
                ;;
      * ) echo "Opção Inválida"
esac
exit

Página anterior     Próxima página

Páginas do artigo
   1. Introdução / O Shell Script
   2. Variáveis / Operadores
   3. Primeiros algoritmos
   4. Estrutura de seleção
   5. Estrutura de repetição
   6. Funções
   7. Vetor (array)
Outros artigos deste autor

Shell Script nosso de cada dia - Episódio 3

Resetando senha de usuário root em sistemas Debian e Red Hat

Exploração de Falhas em Servidores FTP

Teste de Intrusão com Metasploit

Elastic SIEM - Instalação e Configuração do LAB (Parte I)

Leitura recomendada

Explorando a entrada de dados com READ em Bash Shell

Introdução ao Shell Script

Mini-tutorial Shell

Enviar e-mail pelo terminal com mutt

Como trabalhar com funções em bash

  
Comentários
[1] Comentário enviado por di4s em 20/06/2014 - 00:36h

muito bom, parabéns

[2] Comentário enviado por jwolff em 20/06/2014 - 09:22h

obrigado por compartilhar seu conhecimento

[3] Comentário enviado por wagnerfs em 20/06/2014 - 09:38h

Obrigado pessoal pelo incentivo. Acompanhem também os exercícios práticos para LPI que semanalmente posto aqui no VOL. Em breve estarei disponibilizando novos artigos.

[4] Comentário enviado por removido em 20/06/2014 - 12:01h

Ótimo artigo!

Estou estudando Lógica de Programação e ajudou a estudar as variáveis/operadores de forma mais ampla.
VLW!

[5] Comentário enviado por danniel-lara em 20/06/2014 - 14:28h

Meus Parabéns
Muito bom o seu Artigo

[6] Comentário enviado por andregyn em 21/06/2014 - 10:26h

Muito bom!!
Parabéns pelo artigo.

[7] Comentário enviado por xerxeslins em 21/06/2014 - 10:55h

Curti. já botei nos favoritos.

[8] Comentário enviado por removido em 21/06/2014 - 15:19h

Muito bom,espalhando conhecimento!Quando eu pegar mais as manhas do linux e unix também pretendo postar umas dicas aqui.Estou estudando C e shellScript também,foi de grande ajuda.

[9] Comentário enviado por xjc em 22/06/2014 - 00:43h

Show de bola, inovou e jogou duro, parabéns

[10] Comentário enviado por removido em 24/06/2014 - 10:43h

Muito bom seu artigo! Estou iniciando em shellscript e foi de grande proveito este artigo. Escreve muito bem e a bibliografia que utilizou também é muito boa.
Poderia me dizer onde se encontra estes exercícios para a LPI?
Um grande abraço!

[11] Comentário enviado por wagnerfs em 24/06/2014 - 10:50h

Obrigado malkoonqnu. Segue o link do primeiro exercício http://www.vivaolinux.com.br/dica/Exercicio-Pratico-LPIC-01. Abaixo deste, tem o link do segundo. Toda semana estou postando novos exercícios.

[12] Comentário enviado por andregyn em 09/07/2014 - 20:26h

A variável para conversão de Celsius para Fahrenheit ficaria assim: fah=$((9*$cel/5+32))
Belo artigo.

[13] Comentário enviado por raphaellima em 24/09/2014 - 12:03h

Muito bom velho.

[14] Comentário enviado por cleciosc em 30/09/2014 - 20:48h

Excelente artigo.

Ps.: Após apresentada a formula ( F=(9*C+160) / 5 ), o calculo efetuado no script está incorreto, fah=$((9*$cel+160)). Faltou a divisão por 5, ou seja, estaria apresentando um cálculo errado no meu script.

Só foi uma observação principalmente para aqueles que estão acostumados com as teclas CTRL+C e CTRL+V.







Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts