|
From: | Julio C. Neves |
Subject: | Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o |
Date: | Fri, 1 Feb 2019 15:16:23 -0200 |
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 built-ins, 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 e pedi-lhe para testar os tempos de execução, não sem antes apostar um chope. Ele criou dois scripts, um que executava mil vezes a função que ele havia proposto e outro que fazia o mesmo com a minha solução. Não vou dizer qual foi a forma mais veloz, porém adianto que o Alfredo está me devendo um chope... ;)
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;
}
Acho que uma pesquisa nesse sentido pode ajudar:Em sex, 1 de fev de 2019 11:24, 'Julio C. Neves' address@hidden [shell-script] <address@hidden escreveu:Grande Itamar,eu tenho a mesma desconfiança que vc, que depende do utilitário (há muito tempo procuro uma explicação para isso) mas já havia testado no awk proprietário (do UNIX) e não consegui fazer sair com vírgula de jeito nenhum.Testei, no meu Debian, todas as opções da sua resposta e elas só funcionaram usando a opção -N.Acho isso muito louco!Abraços,Julio» Não tem tempo para fazer um curso presencial?» Na sua cidade não tem nenhum bom curso de Linux?» Conheça nosso portal educacional e estude conosco:http://www.dicas-l.com.br/educacaoTambém damos treinamento em sua empresaem qualquer cidade, com certificado e nota fiscal.Grande Mestre Julio.A questão que levantou foi bem peculiar e resolvi testar em algo um conjunto de programas similares, mas com implementações diferentes, então usei o gawk, nawk, mawk e o 'busybox awk'.O script que usei foi o mesmo, inspirado no exemplo que usou do bc:'BEGIN {print 4 * atan2(1,1)}'Sem qualquer modificação o que obtive foi:gawk: 3.14159
nawk: 3,14159
mawk: 3,14159
busybox awk: 3.14159Setando as variáveis LC_ALL=pt_BR.UTF-8 o resultado foi:gawk: 3.14159
nawk: 3,14159
mawk: 3,14159
busybox awk: 3.14159Setando a variável LC_ALL=en_EN o resultado foi:gawk: 3.14159
nawk: 3.14159
mawk: 3.14159
busybox awk: 3.14159Nos exemplos acima gawk e 'busybox awk' não tem alterações independente das mudanças da variáveis de ambiente, no caso do nawk e mawk isso fez diferença no resultado.Ao usar LANG no lugar de LC_ALL nenhum deles foi influenciado, mantendo o comportamento do primeiro exemplo.Quero fazer uma referência especial ao gawk, que possue a opção -N ou --use-lc-numeric:gawk -N 'BEGIN {print 4 * atan2(1,1)}'3,14159LC_ALL=en_EN gawk -N 'BEGIN {print 4 * atan2(1,1)}'
3.14159Então pelo que parece esse comportamento depende diretamente de como foi implementado isso no comando pelos desenvolvedores, então não deve haver um padrão comportamental e como sempre é necessário consultar as man pages dos comandos para definir isso.É possível que haja diferenças também entre versões e sistemas operacionais, mas acredito que esse pequeno teste dá um vislumbre do que acontece.Acho que é só pessoal[]'sItamar
[Prev in Thread] Current Thread [Next in Thread]
- Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o, Julio C. Neves, 2019/02/01
- Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o, Robson Alexandre, 2019/02/01
- Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o, Alfredo Casanova, 2019/02/01
- Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o, Julio C. Neves <=
- Prev by Date: Re: [shell-script] Flag email
- Next by Date: Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o
- Previous by thread: Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o
- Next by thread: Re: [shell-scr ipt] Re: [shell-script] Re: Separar os dígitos de um númer o
- Index(es):