有未設置到/ DELE無操作變量。一個變量變成取消設置來唯一的一次是在函數調用結束時,它被用來作爲一個局部變量的未使用的函數參數:
$ 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>
----
所以如果你想執行一些動作,然後取消設置變量X然後執行操作B,可以使用X作爲局部變量來封裝函數A和/或B.
請注意,雖然默認值爲零或空,但不是零或假,因爲它的類型是「數字字符串」。
您測試未設置變量通過比較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
?
當試圖刪除'stack'變量時,所有內容都在[本答案](http://stackoverflow.com/a/33942659/1983854)中開始。對我來說,看起來有點奇怪,不得不去掉硬編碼var =「」'而不是明白地去掉它。 – fedorqui
是的,我知道了,如果堆棧是作爲一個數組實現的,那麼你會刪除這個數組,但它是作爲一個字符串實現的,那麼爲什麼你不能刪除它呢?答案就是,這不是你用任何語言啓動一個字符串的方式。當然,你可以將它作爲一個完全存儲在'stack [1]'中的字符串來實現,然後高興地刪除'stack',但這不會改進你的代碼的可讀性! –
@EdMorton'awk'BEGIN {a = 0;如果(a == b && length(b)> 0)print 5}''它可以工作嗎? –