Enviado em 02/09/2011 - 11:00h
Estou recebendo a ajuda de um colaborador do VOL que me passou a tarefa conforme segue.
#!/bin/bash
# file: ordenar.sh
# Script coleta digitação de números válidos.
# Deve aguardar a digitação de cada número. Teclar enter salva o número.
# Após digitação pode solicitar a ordenação O(Ordenar)
# Opcionalmente pode escolher sair com a letra S (sair)
# Da série: Aprendendo a aprender. Treinamento de Shell Script.
# TODO: Falta salvar a digitação após sair.
# FIXME: Não trabalha em linha de comando via parâmetros de entrada, exemplo:
# FIXME: ordenar.sh 12 32 43 64 1 2 3 4
# FIXME: ONDE deveria retornar já tudo ordenado na saída.
# FIXME: Próxima versão deve permtir a passagem de parametros conforme acima.
#
# variáveis globais
escolha=""
numero=""
digitando[0]="0" # Array que irá conter números digitados.
contador="0" # Contador que será usado no array.
start="0" # Controla se já tem algum tipo de digitação.
# Inicializa a digitação já efetuada e começa tudo novamente.
function inicializa()
{
unset digitando # Inicializando o array.
unset contador
unset start
contador="0"
start="0"
}
# Só vai mostrar o que já foi digitado para ir acompanhando.
function digitado()
{
if [ $start = "0" ]
then
start="1"
return
fi
echo "Já digitado até o momento...: ${digitando[@]} "
}
# Valor digitado no momento.
function digitei()
{
# Salva o novo valor digitado. Não importa se é repetido ou não.
digitando["$contador"]="$1"
# Faz incremento do contador para o próximo passo.
let contador++
}
# Somente mostra o menu. Se receber uma parâmetro, mostra digite.
function mostramenu()
{
clear
echo "========================================"
echo "Menu Principal"
echo "========================================"
echo ""
echo "d - Digitar números"
echo "o - Ordenar digitação"
echo "i - Inicializa digitação"
echo "s - Sair"
echo "h - Ajuda"
echo ""
if [ "$1" ]; then echo -n "Escolha a opção:" ; fi
}
# Fornece ajuda simples ao protosuário
function ajuda()
{
clear
mostramenu
echo ""
echo "Você só pode digitar as opções d,o,s ou h"
echo "Tente novamente seu protosuário nó cego !!!"
echo ""
read -t 5
clear
mostramenu
return
}
# Informa algum tipo de erro durante a utilização.
# Mensagem é genérica.
# TODO: Futuramente pode ser tratada para responder ao contexto.
function erro()
{
clear
echo ""
echo "Opção digitada é inválida"
echo "Precisa de ajuda ? use o help"
echo ""
read -t 2
}
# Recebe a digitação dos números.
# Se digitar algo inválido, mostrará erro genérico.
# Se escolher alguma opção válida, vai executa-la.
function digitar()
{
while true
do
clear
mostramenu
digitado
echo ""
echo -n "Digite os números desejados...:"
read numero
if test $numero -gt 0
then
digitei $numero
digitado
else
case "$numero" in
o) ordenar ;;
s) sair ;;
i) inicializa ;;
h) ajuda ;;
*) erro
mostramenu
;;
esac
fi 2> /dev/null
done
}
# Ainda não está sendo usada.
# Será necessária quando for camada via linha de comando.
function imprimir()
{
echo ${digitando[*]}
}
# Faz a ordenação da digitação até o momento.
# Deve mostrar o conteúdo digitado e os valores orenados.
function ordenar()
{
# ordenando o que já foi digitado.
for (( last=contador-1;last>0;last--))
do
for((i=0;i<last;i++))
do
j=$((i+1))
if [ ${digitando[i]} -gt ${digitando[j]} ]
then
exchange $i $j
fi
done
done
}
function exchange()
{
temp=${digitando[$1]}
digitando[$1]=${digitando[$2]}
digitando[$2]=$temp
}
# Sai do sistema e digitação será perdida.
# TODO: Não grava o que foi digitado.
function sair()
{
echo "Finalizando o siste bye. Digitação não foi gravada !!! "
read -t 0.2
exit
}
# Menu inicial do sistema.
# usa uma função genérica de uma parte do menu.
# Até escolhas do menu podem ser passadas a uma função para ficar mais genérico.
function _menu()
{
clear
while true
do
mostramenu normal
read escolha
case "$escolha" in
d) digitar ;;
o) ordenar ;;
s) sair ;;
h) ajuda ;;
*) erro ;;
esac
done
}
# Inicializando a manguaça ;)
function main()
{
_menu # Menu principal
}
main {@}
#-----------------------------------------------------------------------------
# Você consegue fazer ele funcionar digitando:
# ordenar.sh 34 32 12 1 98 2
# e o retorno deve ser apenas os números ordenados.
# # 1 2 12 32 34 98
# Estas alterações não podem influenciar o funcionamento normal.
#-----------------------------------------------------------------------------