我编写了一个小函数,使用bc
将十六进制数转换为十进制数。直接调用时,它可以工作,但是当从另一个函数中的单个语句多次调用时,它会失败。
这是一个重现问题的演示脚本:
awk 'function hd(h) {
cmd=sprintf("echo \"ibase=16; obase=A; %s\"|bc", h);
cmd|getline d;
printf("hd(%s)=%s\n", h, d);
return d;
}
function test() {
printf("A=%d, FF=%d\n", hd("A"), hd("FF"));
}
BEGIN {
printf("A=%d, FF=%d\n", hd("A"), hd("FF"));
test();
}'
以下是此输出:
hd(A)=10
hd(FF)=255
A=10, FF=255
hd(A)=255
hd(FF)=255
A=255, FF=255
如您所见,直接在BEGIN
执行时,它可以正常工作;但是当通过test()
函数执行时,它会失败。
我正在使用GNU Awk 3.1.5。我也在另一台机器上尝试过GNU Awk 4.1.1,它也以类似的方式失败了。
答案 0 :(得分:2)
问题是,您没有在cmd|getline d
之后关闭管道。
添加
close(cmd)
<{1>} getline
应该解决您的问题。 getline
应谨慎使用。
P.S。 awk中的printf
是一个声明,而不是一个函数。