Awk

攜帶式陣列檢查

  • October 28, 2017

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()

引用自:https://unix.stackexchange.com/questions/359592