Sorteio

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

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.