我正在玩PROCINFO及其sorted_in索引,以便能够control the array transversal。
然后我想知道PROCINFO
的内容是什么,所以我决定通过它并打印它的值:
$ awk 'BEGIN {for (i in PROCINFO) print i, PROCINFO[i]}'
ppid 7571
pgrpid 14581
api_major 1
api_minor 1
group1 545
gid 545
group2 1000
egid 545
group3 10004
awk: cmd. line:1: fatal: attempt to use array `PROCINFO["identifiers"]' in a scalar context
如您所见,它会中断,因为至少有一个项目本身也是一个数组。
快速解决方法是跳过这个:
awk 'BEGIN {for (i in PROCINFO) {if (i!="identifiers") {print i, PROCINFO[i]}}}'
然而,它看起来有点hacky,并希望有类似
的东西awk 'BEGIN {for (i in PROCINFO) {if (!(a[i] is array)) {print i, PROCINFO[i]}}}'
^^^^^^^^^^^^^^^^
由于没有类似type()
函数来确定变量是数组还是标量,我想知道:有没有办法检查元素是否是数组?
我正在考虑使用for
来解决可能的错误,但我不知道如何。
$ awk 'BEGIN{a[1]=1; for (i in a) print i}'
1
$ awk 'BEGIN{a=1; for (i in a) print i}'
awk: cmd. line:1: fatal: attempt to use scalar `a' as an array
$ awk 'BEGIN{a[1]=1; print a}'
awk: cmd. line:1: fatal: attempt to use array `a' in a scalar context
答案 0 :(得分:2)
在GNU Awk中,有一个答案,但推荐的方法取决于您运行的是什么版本。感谢fedorqui更新!
从2017年10月发布的GNU Awk 4.2开始,有一个新功能typeof()
来检查这一点,如测试版的发行说明中所示:
- new typeof()函数可用于指示变量或数组元素是否为数组,正则表达式,字符串或数字。不推荐使用isarray()函数,而选择typeof()。
现在你可以说:
$ awk 'BEGIN { a[1] = "a"; print typeof(a) }'
array
按如下方式执行检查:
$ awk 'BEGIN { a = "a"; if (typeof(a) == "array") print "yes" }'
$ awk 'BEGIN { a[1] = "a"; if (typeof(a) == "array") print "yes" }'
yes
在旧版本中,您可以使用isarray()
:
$ awk 'BEGIN { a = "a"; if (isarray(a)) print "yes" }'
$ awk 'BEGIN { a[1] = "a"; if (isarray(a)) print "yes" }'
yes
从手册页:
isarray(x)
Return true if x is an array, false otherwise.