我想知道是否可以删除awk
中的变量。对于数组,您可以说delete a[2]
,并且将删除数组2
的索引a[]
。但是,对于变量我找不到方法。
我最接近的是说var=""
或var=0
。
但是,似乎不存在的变量的默认值是0
或False
:
$ awk 'BEGIN {if (b==0) print 5}'
5
$ awk 'BEGIN {if (!b) print 5}'
5
所以我也想知道是否可以区分设置为0
的变量和尚未设置的变量,因为它似乎不是:
$ awk 'BEGIN {a=0; if (a==b) print 5}'
5
答案 0 :(得分:8)
没有取消/删除变量的操作。变量再次取消设置的唯一时间是在函数调用结束时,它将一个未使用的函数参数用作局部变量:
$ cat tst.awk
function foo( arg ) {
if ( (arg=="") && (arg==0) ) {
print "arg is not set"
}
else {
printf "before assignment: arg=<%s>\n",arg
}
arg = rand()
printf "after assignment: arg=<%s>\n",arg
print "----"
}
BEGIN {
foo()
foo()
}
$ awk -f tst.awk file
arg is not set
after assignment: arg=<0.237788>
----
arg is not set
after assignment: arg=<0.291066>
----
所以如果你想执行一些动作A然后取消设置变量X然后执行动作B,你可以使用X作为局部变量将A和/或B封装在函数中。
请注意,默认值为零或null,不为零或false,因为其类型为&#34;数字字符串&#34;。
通过将未变量变量与null和零进行比较来测试它:
$ awk 'BEGIN{ if ((x=="") && (x==0)) print "y" }'
y
$ awk 'BEGIN{ x=0; if ((x=="") && (x==0)) print "y" }'
$ awk 'BEGIN{ x=""; if ((x=="") && (x==0)) print "y" }'
如果你需要删除一个变量,那么你总是可以使用单元素数组:
$ awk 'BEGIN{ if ((x[1]=="") && (x[1]==0)) print "y" }'
y
$ awk 'BEGIN{ x[1]=""; if ((x[1]=="") && (x[1]==0)) print "y" }'
$ awk 'BEGIN{ x[1]=""; delete x; if ((x[1]=="") && (x[1]==0)) print "y" }'
y
但恕我直言,混淆了你的代码。
取消设置变量的用例是什么?你可以用var=""
或var=0
做什么呢?
答案 1 :(得分:2)
未设置的变量会扩展为""
或0
,具体取决于评估它的上下文。
出于这个原因,我会说这是一个偏好问题,取决于变量的用法。
鉴于我们在a + 0
块中使用+a
(或略有争议的END
)将潜在的未设置变量a
强制转换为数字类型,我想你可以争辩说,自然的空虚&#34;值为""
。
我不确定是否有太多内容可以阅读您在问题中显示的案例,具体如下:
$ awk 'BEGIN { if (!"") print }'
5
(""
是假的,不出所料)
$ awk 'BEGIN { if (b == "") print 5 }'
5
(未设置的变量评估等于""
,与0
相同