在awk中测试不存在的变量

时间:2018-03-23 10:51:40

标签: awk

我想测试一个可能存在或不存在的变量的值,我正在做:

if(a<1) print "fail"

工作正常。

如果我然后重新测试相同的变量,并且如果首先没有设置此变量,awk将看到此变量设置。

$ awk 'BEGIN{if(a<1) print "fail"; if(a) print "fail"; }'
fail

在上面的陈述中,我希望没有任何内容正在打印,因为变量a永远不会被设置为任何内容。

你对这种行为有什么解释吗?

如果重要,请使用GNU Awk 4.2.1

3 个答案:

答案 0 :(得分:3)

背景:所有标量awk变量最终都是“numeric”或“string”类型。未初始化的变量属于不同类型,称为“数字字符串”,因为它不知道它的最终类型是什么,它具有零或空的唯一值。看起来像数字的用户输入也是数字字符串类型,但显然具有特定值,而不是零或空。第一次使用变量时,awk根据使用该变量的上下文确定它的最终类型(数字或字符串)。

所以在你的代码中你有:

if(a<1) print "fail"

a尚未设置,因此它具有零或零值,并且在与数字1比较的上下文中,无论您将其视为零还是空,两个可能的值都小于1,因此打印"fail"https://www.gnu.org/software/gawk/manual/gawk.html#Variable-Typing上有一个图表,显示实际使用的数字比较,但在这种情况下无关紧要。

因此,您的代码在第一次测试后没有按照您的想法设置a。一个更有趣的测试可以更好地展示发生的事情:

$ awk 'BEGIN{if(a<1) print "is lt 1"; if(a=="") print "is null"; if (a==0) print "is 0" }'
is lt 1
is null
is 0

$ awk 'BEGIN{a=0; if(a<1) print "is lt 1"; if(a=="") print "is null"; if (a==0) print "is 0" }'
is lt 1
is 0

$ awk 'BEGIN{a=""; if(a<1) print "is lt 1"; if(a=="") print "is null"; if (a==0) print "is 0" }'
is lt 1
is null

答案 1 :(得分:1)

未分配的变量采用“false”值,即0或空字符串,基于它们所引用的上下文。这可能会澄清......

$ awk 'BEGIN{if(a==0)  print "a=0"; 
             if(a=="") print "a=\"\""; 
             if(!a)    print "a is false"}'

打印

a=0
a=""
a is false

答案 2 :(得分:0)

来自文档

  

AWK变量是动态的;它们在第一次使用时就会存在。
  ...
  未初始化的变量具有数值0和字符串值&#34;&#34; (null或空字符串)。

在你的陈述中:

$ awk 'BEGIN{if(a<1) print "fail"; if(a) print "fail"; }'

由于a已使用0(或"")初始化,if (a<1)成功且if (a)失败。