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

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

printf em um loop while só funcionou com eval


From: Paulo Bettega
Subject: printf em um loop while só funcionou com eval
Date: Sat, 31 Jan 2015 02:49:55 -0200
User-agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.4.0

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?



reply via email to

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