Alain, @ 09/02/05 - 20:05:
Eliphas Levy Theodoro escreveu:
$ A=500.175
$ awk "BEGIN { print ($A > 500) ? \"true\" : \"false\" }"
true
Alguém esqueceu o BEGIN ;)
Isso é simplesmente um problema de sintaxe. O awk não aceita aspas
simples como delimitador de strings, e o shell só faz substituição de
variáveis na linha de comando se não estiverem dentro de aspas
simples.
Sempre vi comandos de awk com aspas simples, você poderia explicar
quando e porque aspas simples ou duplas (ou até inversas)?
O awk é chato com o delimitador de suas strings. Tem que ser sempre em
aspas duplas:
$ awk 'BEGIN { if ("a" == "a") { print "aa"; } }'
aa
$ awk "BEGIN { if ('a' == 'a') { print 'aa'; } }"
awk: cmd. line:1: ^ invalid char ''' in expression
Então a maioria das vezes você vai ver comandos de uma linha em awk
entre aspas simples, pois aí não é necessário escapar as aspas duplas
dentro do script, como:
$ awk "BEGIN { if (\"a\" == \"a\") { print \"aa\"; } }"
aa
Porém, o shell só troca variáveis de ambiente se elas *NÃO* estiverem
dentro de aspas simples:
$ echo "$HOME" '$HOME'
/home/eliphas $HOME
Por isso a necessidade de usar aspas duplas no script awk. Claro que não
é suuuuuper necessário, o awk (assim como o perl) tem meios de pegar as
variáveis de ambiente sem o auxílio do shell:
$ awk 'BEGIN { print ENVIRON["HOME"] }'
/home/eliphas
Eu normalmente começo a escrever em aspas simples. Se depois descubro
que vou precisar de uma ou outra variável, vejo qual é mais fácil:
Trocar as aspas simples por duplas ou usar o ENVIRON["VAR"].