Com o GNU awk
5.3.1, quero atribuir um valor padrão a uma variável se ela não tiver recebido um na linha de comando. O valor pode ser qualquer coisa, incluindo 0. Pensei que poderia usar, SYMTAB
mas como SYMTAB
é construído durante a análise e antes da execução, não funciona:
$ awk -v v=1 'BEGIN { if(!("v" in SYMTAB)) v = 42; print "v = " v }' /dev/null
v = 1
$ awk 'BEGIN { if(!("v" in SYMTAB)) v = 42; print "v = " v }' /dev/null
v =
Existe outra maneira?
Eu exploraria
typeof
a função para esta tarefa da seguinte maneiradá saída
(testado no GNU Awk 5.3.1)
A maneira de determinar se uma variável está definida ou não em qualquer awk é comparando-a com ambos
0
e ,null
como o valor inicial para qualquer variável escalar é0-or-null
, não há necessidade de umaSYMTAB[]
pesquisa específica do gawk (que você já descobriu que não pode usar para isso, pois a variávelv
existirá em ,SYMTAB[]
pois é mencionada no seu código) outypeof()
chamada. Por exemplo:A propósito, é assim que você também pode saber se um parâmetro opcional para uma função foi passado ou não.
A propósito, além da portabilidade, há uma diferença funcional entre a abordagem acima e o uso do gawk,
typeof(v) == "untyped"
conforme sugerido em outro lugar:Se você for usar
typeof()
isso, precisará verificar se a saída éuntyped
ouunassigned
:Veja a página de manual do gawk para mais informações sobre isso :-).