Este script nasceu no segundo ENCASOFT (Encontro Capixaba de Software Livre), realizado em Colatina-ES. Na ocasião estava assistindo a uma palestra, enquanto preparava um Script Shell para realizar o sorteio entre os nomes dos inscritos no encontro. Os nomes sorteados eram presenteados com brindes fornecidos pelos colaboradores do encontro.
A primeiro versão era bem simples, mas foi ganhando algumas implementações para deixar o sorteio mais interessante e funcional. As funcionalidades dos script são:
- Realiza vários sorteios antes de apresentar o resultado final. A idéia é deixar o resultado mais aleatório possível. Para um dado número de interações ($1), é gerado aleatóriamente, o número de sorteios (NINTER). Cada resultado será sorteado NINTER vezes antes de apresentar o sorteado final.
- A apresentação foi incrementada com algumas cores e apresentação de resultados intermediários, que geram a impressão de uma roleta de nomes passando pela tela. A emoção!
- A lista de nomes dos inscritos é passada como o parâmetro de entrada no script $2;
- O nome do patrocinador do evento, que está oferecendo o brinde é apresentado durante o sorteio.
Para o uso do script é necessário passar três variáveis:
- $1 – número máximo de interações;
- $2 – lista de nomes dos inscritos para o sorteio, em ascii;
- $3 – nome da empresa patrocinadora.
O echo -e “\033[…”
Aproveitando, vou falar um pouco dos caracteres de controle utilizados neste script. Estes caracteres de controle são importantes para se gerar saídas personalizadas em seus programas, com posicionamento de cursor, cores e outras ações.
Uma forma bem eficiente de inserir caracteres de controle em um script é utilizar o comento echo -e
e passar a forma octal do espace (\033).
Os caracteres de controle utilizados neste script são apresentados na tabela abaixo:
Caracter de controle | Descrição |
---|---|
\033[m | cor do texto normal |
\033[1;31m | cor do texto vermelho |
\033[1;32m | cor do texto verde |
\033[1;34m | cor do texto azul |
\033[0K | apaga do cursor até o fim da linha |
\033[2A | move o cursor duas linhas para cima, sem mudar de coluna |
Para conhecer todos os códigos de cores, experimente o comando abaixo:
$ for i in `seq 0 7`; do \ for j in `seq 0 7`; do \ for k in ";1" ""; do \ texto="4${j};3${i}${k}"; \ echo -en "\033[${texto}m $texto \033[m"; \ done; \ done; \ echo; done
Maximize o console para ver melhor os códigos.
O Aurélio possui um artigo bem interessante, que apresenta, senão todos, muitos dos caracteres de controle do Shell. Veja o texto neste link
O script sorteio
O script do sorteio está apresentado abaixo.
#!/bin/bash # Feito por Rudson R. Alves # para o Encasoft 1.2 - VV # 23/10/2006 # # Entrada: # $1 número máximo de intereções, menor que 32767 # $2 lista de nomes # $3 Nome da empresa patrocinante # # Help if [ $# -ne 3 ]; then echo -e "Use: sorteio [N máx de interações] [lista de nomes] [nome da empresa]" exit fi # Nome do Evento EVENT="ENCASOFT 2.0" # Número máximo de colunas NCOLUNS=$(( $( tput cols ) - 3 )) # Número de linhas do texto NLINES=$( cat $2 | wc -l ) # Sorteio em loop while [ "$ANS" != "q" ]; do # Número de Interações NINTER=$(( $RANDOM % $1 +1 )) # Limpa a tela para o seoteio clear # Apaga o cursor tput civis # Imprime cabeçalho echo -e "\033[1;34m$EVENT\n \033[1;32mSorteio \033[4;36m$3\033[m" echo -e "\033[1;32mInscritos: \033[1;34m$NLINES\033[1;32m Interações: \033[1;34m$NINTER\033[1;31m" for i in $( seq 0 $NINTER ); do # Sorteia a linha LINE=$(( $RANDOM % $NLINES + 1 )) # Pega a linha do texto NAME="$( eval "sed -r '$LINE! d'" $2 )" # Apresenta o conteúdo echo -e "\033[0K ${NAME:0:$NCOLUNS}" # Posiciona o cursor duas linhas acima echo -e "\033[2A" done echo -e "\n\033[m" # Acende o cursor tput cnorm # Ler teclado: "q" para fim read ANS done