shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Re: [shell-script] Re: [shell-scr ipt] Re: [shell-scr


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

Vlw Alfredo,
mas ali ele quer saber quais as variaveis de ambiente que um prg usa. Minha dúvida é qual a relação variável->prg que permitem a certos utilitários receberem uma variável que podemos alterar seu valor somente para executar um utilitário, restaurando seu vl inicial logo após. É como se o utilitário alterasse o valor no seu bojo, permanecendo a do shell pai inalterada, que prevaleceria após o término.

Falei a beça e não disse nada, pq é confuso de explicar. A melhor forma de entender, são os exemplos que dei.

PS: já te disse que seu nome está no meu livro?
Vai aí um trecho dele, mas lá no fim tem um trecho só para te relembrar um compromisso... ;)
====================================================

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;

}

====================================================

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: 



Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.



Em sex, 1 de fev de 2019 às 14:10, Alfredo Casanova address@hidden [shell-script] <address@hidden> escreveu:
 


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: 



Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.



Em qui, 31 de jan de 2019 às 20:08, address@hidden [shell-script] <address@hidden> escreveu:
 

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.14159

Setando as variáveis LC_ALL=pt_BR.UTF-8 o resultado foi:
gawk: 3.14159
nawk: 3,14159
mawk: 3,14159
busybox awk: 3.14159

Setando a variável LC_ALL=en_EN o resultado foi:
gawk: 3.14159
nawk: 3.14159
mawk: 3.14159
busybox awk: 3.14159

Nos 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,14159


LC_ALL=en_EN gawk -N 'BEGIN {print 4 * atan2(1,1)}'
3.14159

Entã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

[]'s
Itamar


reply via email to

[Prev in Thread] Current Thread [Next in Thread]