Algoritmos em Shell Script

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

[ Hits: 48.773 ]

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

Exploração de Falhas em Servidores FTP

Teste de Intrusão com Metasploit

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

Shell Script nosso de cada dia - Episódio 3

Montando Servidor de Internet com Ubuntu Server

Leitura recomendada

Pipelines (Canalizadores)

Introdução a LUA, uma poderosa linguagem de programação

Como trabalhar com funções em bash

Explorando a entrada de dados com READ em Bash Shell

Enviar e-mail pelo terminal com mutt

  
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