[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?
- printf em um loop while só funcionou com eval,
Paulo Bettega <=