awk(变量、数组元素和字段)中的标量对象是动态类型的。这意味着它们的类型可以随着程序的运行而改变,从使用前的无类型,到字符串或数字,然后从字符串到数字或从数字到字符串,随着程序的进行。
你不能对无类型变量做很多事情,除了告诉它们是无类型的。以下程序针对a进行测试;当a从未被赋值时,测试成功。它还使用内置typeof()函数来显示a的类型:
$ gawk 'BEGIN { print (a == "" && a == 0 ?
> "a is untyped" : "a has a type!") ; print typeof(a) }'
a is untyped
unassigned
类似地,给标量赋予字符串值时,标量就具有字符串类型,例如来自字符串常量或来自另一个具有字符串类型的标量:
gawk 'BEGIN { a = 42 ; print typeof(a) ;b = a ; print typeof(b) }'
到目前为止,这一切都简单明了。但是,当awk处理来自用户的数据时会是怎么样呢?让我们从现场数据开始。以下命令应该产生什么作为输出?
echo hello | awk '{ printf("%s %s < 42\n", $1,
($1 < 42 ? "is" : "is not")) }'
由于’hello’是字母数据,awk只能做字符串比较。在内部