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