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

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

Re: [shell-script] printf em um loop while só funcionou com eval


From: Ronaldo Ferreira de Lima
Subject: Re: [shell-script] printf em um loop while só funcionou com eval
Date: Sat, 31 Jan 2015 11:39:36 -0200
User-agent: mutt-ng/devel-r804 (Linux)

On Sat, Jan 31, 2015 at 02:49:55AM -0200, Paulo Bettega address@hidden 
[shell-script] wrote:
> Olá pessoal, tentei fazer esse loop, já que a linha do printf é sempre a 
> mesma.
> (Sei que nesse caso o loop é praticamente igual a escrever uma linha de
> printf para cada linha do 'here strings', mas no futuro pretendo colocar
> os dados num vetor).
> 
> d1=4;d2=10;d3=5;m1=5;m2=3;m3=12;ano=2015
> while read linha; do printf '%20s%02d/%02d/%d\n' $linha
> done <<<"'Data: ' $d1 $m1 $ano
> 'Outra Data: ' $d2 $m2 $ano
> 'Mais uma data: ' $d3 $m3 $ano"
> 
> A saída que eu queria era essa (talvez perca o alinhamento, os : são 
> alinhados)
>                Data: 04/05/2015
>          Outra Data: 10/03/2015
>       Mais uma data: 05/12/2015
> 
> mas o resultado foi esse
>                'Data:00/04/5
>                  201500/00/0
> bash: printf: Data:: invalid number
>                'Outra00/00/10
>                     32015/00/0
> bash: printf: uma: invalid number
> bash: printf: data:: invalid number
>                 'Mais00/00/0
>                     512/2015/0
> 
> Não entendi porque aconteceu isso, me pareceu tudo certo, pois o texto está
> entre aspas simples, então o printf deveria reconhecer o texto todo como 
> string %20s
> e as três variáveis com a formatação da data %02d/%02d/%d
> 
> Não sei porque, mas achei que o printf não estava recebendo a variável $linha 
> como deveria,
> então "chutei" um eval antes do printf, e o resultado foi animador:
> 
> while read linha; do eval printf '%20s%02d/%02d/%d\n' $linha
> done <<<"'Data: ' $d1 $m1 $ano
> 'Outra Data: ' $d2 $m2 $ano
> 'Mais uma data: ' $d3 $m3 $ano"
>                Data: 04/05/2015n        Outra Data: 10/03/2015n     Mais uma 
> data: 05/12/2015n
> 
> O resultado foi o que eu queria, apenas não quebrou a linha porque o \n
> foi interpretado como "escapen", eu acho.
> Então coloquei outro escape antes do \n e deu certo:
> 
> while read linha; do eval printf '%20s%02d/%02d/%d\\n' $linha
> done <<<"'Data: ' $d1 $m1 $ano
> 'Outra Data: ' $d2 $m2 $ano
> 'Mais uma data: ' $d3 $m3 $ano"
>                Data: 04/05/2015
>          Outra Data: 10/03/2015
>       Mais uma data: 05/12/2015
> 
> Outro jeito que deu certo foi colocar apenas 'printf [formato]' entre aspas,
> eval "printf '%20s%02d/%02d/%d\n'" $linha
> ou
> eval 'printf "%20s%02d/%02d/%d\n"' $linha
> 
> No fim das contas o loop deu certo, mas eu não entendi porque.
> Eu realmente achei que apenas colocando o printf dentro do loop teria que 
> funcionar.
> Porque o printf não reconhece direito a variável $linha sem o eval?
É possível  verificar o que  aconteceu usando o  "modo debug" set  -x, o
grande problema foram os espaços "extras". Para evitar essas surpresas é
recomendável utilizar o método tradicional:

    printf '%20s: %02d/%02d/%d\n' "$str" $dia $mes $ano


[]'s
-- 
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
http://tecnoveneno.blogspot.com


reply via email to

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