|
From: | Julio C. Neves |
Subject: | Re: [shell-script-pt] Bem vindo ao Ulisses! |
Date: | Tue, 16 Jun 2020 10:38:11 -0300 |
Já tinha mandado a décima edição deste livro para a editora quando o Alfredo Casanova, colega da lista shell-script do Yahoo Groups, mandou a seguinte dica para a nossa lista:
“Só compartilhando uma funçãozinha que fiz aqui para desenhar caixas de mensagem (só funciona para mensagens com uma linha. Se alguém quiser alterar, fique à vontade)”
E nos brindou com esse código:
function DrawBox
{
string="$*";
tamanho=${#string}
tput setaf 4; printf "\e(0\x6c\e(B"
for i in $(seq $tamanho)
do printf "\e(0\x71\e(B"
done
printf "\e(0\x6b\e(B\n"; tput sgr0;
tput setaf 4; printf "\e(0\x78\e(B"
tput setaf 1; tput bold; echo -n $string; tput sgr0
tput setaf 4; printf "\e(0\x78\e(B\n"; tput sgr0;
tput setaf 4; printf "\e(0\x6d\e(B"
for i in $(seq $tamanho)
do printf "\e(0\x71\e(B"
done
printf "\e(0\x6a\e(B\n"; tput sgr0;
}
Seu uso seria da seguinte forma:
$ DrawBox Qualquer frase que caiba no terminal
Qualquer frase que caiba no terminal |
Só que essa caixa é azul (tput setaf 4) e as letras são vermelhas, com ênfase (tput setaf 1; tput bold).
Mas observe a tabela a seguir. Ela explica os códigos gerados por esse monte de printf estranho:
O printf |
Produz |
\e(0\x6c\e(B |
┌ |
\e(0\x71\e(B |
– |
\e(0\x6b\e(B |
┐ |
\e(0\x78\e(B |
│ |
\e(0\x6d\e(B |
└ |
\e(0\x6a\e(B |
┘ |
Como eu tinha acabado de escrever os exemplos que vimos antes e ainda estava com eles na cabeça, sugeri que o for que ele usou para fazer as linhas horizontais fosse trocado; assim, substituiríamos:
for i in $(seq $tamanho)
do printf "\e(0\x71\e(B"
done
Por:
printf -v linha "%${tamanho}s" ' '
printf -v traco "\e(0\x71\e(B"
echo -n ${linha// /$traco}
Tudo Shell puro, pois o for, o printf e o echo são builtins, mas como o printf dentro do for seria executado tantas vezes quantos traços horizontais houvessem, imaginei que a minha solução fosse um pouco mais veloz.
O código otimizado ficaria assim:
function DrawBox
{
string="$*";
tamanho=${#string}
tput setaf 4; printf "\e(0\x6c\e(B"
printf -v linha "%${tamanho}s" ' '
printf -v traco "\e(0\x71\e(B"
echo -n ${linha// /$traco}
printf "\e(0\x6b\e(B\n"; tput sgr0;
tput setaf 4; printf "\e(0\x78\e(B"
tput setaf 1; tput bold; echo -n $string; tput sgr0
tput setaf 4; printf "\e(0\x78\e(B\n"; tput sgr0;
tput setaf 4; printf "\e(0\x6d\e(B"
printf -v linha "%${tamanho}s" ' '
printf -v traco "\e(0\x71\e(B"
echo -n ${linha// /$traco}
printf "\e(0\x6a\e(B\n"; tput sgr0;
}
Então agora, voltando aos nossos exemplos...
_______________________________________________Estou enviando um e-mail para testar se um amigo está ou não recebendo os e-mails.
Ontem à noite ele me perguntou "o que tinha que fazer para ficar bom no bash, além de ler o man"
Minha resposta foi:
1) Pare de ler o man e compre o livro do Júlio Neves (ele já fez)
2) Faça ao menos um curso do Júlio Neves (Mandei o link do workshop do Júlio e Rubens, ele já começou)
3) Entre na lista brasileira de shell-script (estamos testando agora)Vamos ver se o planejamento vai dar certo--[]'s
Alfredo Tristão Casanova .͘.
Linux User #228230
tel: +55 61 9655 9619
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
[Prev in Thread] | Current Thread | [Next in Thread] |