2015-11-26 118 views
4

我想知道是否可以刪除awk中的變量。對於數組,您可以說delete a[2],並且數組a[]的索引2將被刪除。但是,對於一個變量我找不到方法。刪除awk中的變量

我得到的最接近的就是var=""var=0

不過,似乎一個不存在的變量的默認值是0False

$ 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 

回答

5

有未設置到/ 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

+0

當試圖刪除'stack'變量時,所有內容都在[本答案](http://stackoverflow.com/a/33942659/1983854)中開始。對我來說,看起來有點奇怪,不得不去掉硬編碼var =「」'而不是明白地去掉它。 – fedorqui

+0

是的,我知道了,如果堆棧是作爲一個數組實現的,那麼你會刪除這個數組,但它是作爲一個字符串實現的,那麼爲什麼你不能刪除它呢?答案就是,這不是你用任何語言啓動一個字符串的方式。當然,你可以將它作爲一個完全存儲在'stack [1]'中的字符串來實現,然後高興地刪除'stack',但這不會改進你的代碼的可讀性! –

+0

@EdMorton'awk'BEGIN {a = 0;如果(a == b && length(b)> 0)print 5}''它可以工作嗎? –

2

的未固化的變量擴展爲""0,這取決於它是被EVA上下文luated。

因此,我會說這是一個偏好問題,取決於變量的用法。

由於我們使用a + 0(或稍有爭議+a)在END塊到潛在的未設置變量a強制爲數值型,我猜你可能會說,自然「空」值將是""

我不知道,有太多的給予,在閱讀到您的問題顯示的情況如下:

$ awk 'BEGIN { if (!"") print }' 
5 

""是假的,意料之中)

$ awk 'BEGIN { if (b == "") print 5 }' 
5 

(未設置變量計算等於"",只是一樣0

+0

對於最後一點,它不會刪除索引以及它在內存中指向的內容 - 在'delete a [2]'後嘗試'2'。 –

+0

@Ed我想,正確解釋'2'的輸出將需要知道測試正在做什麼(我不知道!) –

+1

'a'是一個哈希表,'a'中的2正在訪問您在散列'2'時獲得的內存位置。如果它被填充,那麼'a中的2成功,否則不成功。當你說'刪除一個[2]''時,你在釋放'2'指向的位置釋放內存。 –