Awk
攜帶式陣列檢查
Gawk 有“isarray”:
if (isarray(x)) print "is array" else print "is scalar"
但是 Mawk 和“gawk –posix”不會:
fatal: function 'isarray' not defined
這可能會導致問題:
x x[1] fatal: attempt to use scalar 'x' as an array
或者:
x[1] x fatal: attempt to use array 'x' in a scalar context
awk 可以在不使用“isarray”函式的情況下檢測數組嗎?
我也不認為這是可能的。
但我會在 busybox 中補充一點
awk
,變數既可以是數組也可以是標量。可以這樣做:a = "foo"; a["foo"] = "bar"
當一個變數被用作一個數組時,
length()
返回數組中元素的數量,即使它也被定義為一個標量(儘管您可以使用它length(var "")
來獲取標量的長度),除非變數已經被作為參數傳遞給函式並在那里分配為標量(可以被視為錯誤):$ busybox awk 'BEGIN{a[1] = 1; a = "foo"; print length(a), length(a"")}' 1 3 $ busybox awk 'function f(x) {x = "xxx"; print x[1], length(x)} BEGIN{a[1]=1; x = "yyy"; print a[1], length(a); f(a)}' 1 1 1 3
太糟糕了,否則在
isarray()
那裡定義一個函式會很容易。我們仍然可以判斷一個變數是否是一個包含至少一個元素的數組function isnonemptyarray(x) { return length(x) > 0 && length(x "") == 0 }
(假設變數沒有被定義為數組和標量)
無論如何,這是
busybox
awk
具體的。length()
不能在攜帶式陣列上使用。可以通過以下方式定義可移植array_length()
功能:function array_length(a, tmp1, tmp2) { tmp1 = 0 for (tmp2 in a) tmp1++ return tmp1 }
但這不能在非數組變數上可移植地使用。
不,如果可以的話,就不需要 gawk 來介紹了
isarray()
。