Até agora, criamos algoritmos que têm sua execução apenas uma vez. Para uma nova execução, é preciso acionar o script. Mas, e se fosse preciso calcular uma média para 50 alunos? Algo bastante trabalhoso, não acham?!
Pensando nisso, o Shell, como em outras linguagens de programação, dispõe das estruturas
while (enquanto) e
for (para).
O
while faz um teste no início do algoritmo para dar continuidade, ou não, à execução do código. Já no caso do
for, é informado um valor pré-definido de quantas vezes haverá a repetição do código.
Tanto na estrutura
while quanto no
for, teremos o elemento incrementador ou contador. A função deste, é fazer um incremento a cada iteração do código.
Este número é inteiro e pode ter iterações de 2 em 2, entre outras mediante a função do algoritmo. Este incremento assemelha-se a um ponteiro de relógio, onde a cada segundo é incrementado 1, até completar os 60 segundos complementando um minuto, dando a vez ao próximo ponteiro.
Abaixo, alguns algoritmos com essas duas estruturas:
Algoritmo 011:
#!/bin/bash
#Autor: k666
#Data: 15/01/2014
#Algoritmo que calcula a média anual de uma turma com 5 alunos
#Iniciando a variável contador (con - pode ser o nome que achar melhor)
#e a variável utilizada para acumular (acm) as médias para que no final
#seja calculado a média da turma.
con=1
acm=0
#A média anual será armazenada na variável ma
#Caso for digitar um média com casas decimais,
#utilizar o ponto ao invés da vírgula. Ex: 2.4
while [ $con -lt 6 ]
do
echo -n "Digite a média anual do $conº aluno: "
read ma
#No cálculo da variável acm estou utilizando a crase (``) para
#atribuir o valor do cálculo a esta. Uma outra forma de atribuição
acm=`echo "scale=2;$acm+$ma" | bc`
con=$(($con + 1))
done
#Calculo da média anual da turma (mat). Estou utilizando o comando
#scale junto com a calculadora bc para obter resultados de valor
#decimal especificando duas casas decimais ou quantas você desejar
mat=$(echo "scale=2;$acm/5" | bc -l)
echo "Média anual da turma $mat"
Algoritmo 012:
#!/bin/bash
#Autor: k666
#Data: 15/01/2014
#Algoritmo que executa testes de ping para um range de IPs e ao
#final mostra a quantidade total de hosts.
echo "---------------------------------------"
echo " ALGORITMO TESTAR IP "
echo "---------------------------------------"
echo
#Iniciando a variável contador (con)
con=0
#Aqui deve ser informado a rede. Ex.: 192.168.1 ou 192.168.2 e assim por diante
echo -n "Informe a rede: "
read net
#Informe o IP inicial do teste
echo -n "Informe o IP inicial: "
read ipini
#Informe o IP final do teste
echo -n "Informe o IP final: "
read ipfim
#Cálculo de quantos IPs receberam o teste de ping
#também será usado para fazer uma comparação com o contador
#na estrutura de repetição
calc=$(($ipfim-ipini))
#O primeiro teste da estrutura while vai ser com o primeiro
#IP informado pelo usuário. Assim que o laço começar a ser
#executado, este IP inicial será somando com o contador
#até atingir o total de hosts que deve ser "pingado"
test="$ipini"
while [ $con -le $calc ]
do
#Aqui o comando ping executará um teste em cada host com a
#opção -c1 e será unida a viável $net e $test onde esta última
#contêm o IP dentro do range a ser testado
echo `ping -c1 $net.$test`
con=$(($con + 1))
test=$(($ipini+$con))
done
sleep 2
clear
echo "--------------------------------"
echo " FIM DOS TESTES "
echo "--------------------------------"
echo
echo "-> Total de IPs testados: $con"
Algoritmo 013:
#!/bin/bash
#Autor: k666
#Data: 17/01/2014
#Algoritmo que imprime a tabuada de cinco
#Aqui é atribuir o nome a variável contador de i e não
#de con como fiz em outro exemplos. Você pode atribuir
#o nome que desejar contanto que saiba a finalidade deste
i=0
#Para este exemplo estou utilizando a tabuada de 5, porém, caso
#necessite usar um outro valor, basta substituir o 5
while [ $i -le 10 ]
do
#Aqui vai o cálculo da multiplicação. Quando i for 0, então será
#multiplicado por 5 e assim sucessivamente até que o contador (i)
#seja 10 e finalize a execução do laço.
calc=$(($i*5))
echo "$i X 5 = $calc"
i=$((i + 1))
done
Algoritmo 014:
#!/bin/bash
#Autor: k666
#Data: 17/01/2014
#Algoritmo que calcula o fatorial de um
#número fornecido pelo usuário
#O fatorial é calculado da seguinte forma:
#fatorial de 3: 3x2x1 = 6
#fatorial de 4: 4x3x2x1 = 24
echo "Digite o número que queria saber o fatorial: "
read num
#Iniciando a variável fatorial(fat)
fat=1
#O contador i inicia com o número 1 e o loop será
#executado mediante seu valor ser menor igual ao valor
#da variável $num
for ((i=1; i <= $num ; i++))
do
#Aqui é utilizada a variável $fat que será multiplicado
#pela variável $i(contador) até o fim do loop
fat=$(($fat*$i))
done
echo "O fatorial de $num é: $fat "
Algoritmo 015:
#!/bin/bash
#Autor: k666
#Data: 17/01/2014
#Algoritmo que simule uma contagem regressiva de 10 minutos, ou seja,
#mostre 10:00, e então 9:59, 9:58, ..., 9:00, 8:59 até 0:00
#Serve apenas para exibir a contagem será iniciada em 10:00
echo "10:00"
#Variável min (minutos) e seg (segundos)
#O primeiro for será utilizado para contar os minutos (min)
for ((min=9; min>=0; min--))
do
#O primeiro for será utilizado para contar os segundos (seg)
#Este for significa que o minuto só mudará quando o loop do segundo
#chegar ao seu fim. Tanto na variável min quanto seg vai decrementar
#(min-- e seg--), ou seja, diminuirá de 1 em 1
for ((seg=59; seg>=0; seg--))
do
#Perceba que entre a variável $min e $seg tem : (dois pontos) para
#fazer a separação de minutos e segundos
echo "$min:$seg"
done
done