我想测试一个可能存在或不存在的变量的值,我正在做:
if(a<1) print "fail"
工作正常。
如果我然后重新测试相同的变量,并且如果首先没有设置此变量,awk
将看到此变量设置。
$ awk 'BEGIN{if(a<1) print "fail"; if(a) print "fail"; }'
fail
在上面的陈述中,我希望没有任何内容正在打印,因为变量a
永远不会被设置为任何内容。
你对这种行为有什么解释吗?
如果重要,请使用GNU Awk 4.2.1
答案 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)
失败。