我正在编写一些用于数据验证的 awk 脚本。这些旨在由另一个进程选择和调用,该进程需要查看 awk 脚本的退出代码以确定内容是否有效。但我在读取退出退出代码时遇到问题:
我编写这个脚本是为了尝试重现该程序并运行它......
#!/bin/awk -f
BEGIN { exit 1 }
$ ./test.sh ; echo $?
0
我原以为输出是 1。立即怀疑 awk 是错误的,而我是对的,我尝试了这个:
$ awk 'BEGIN { exit 1 }' ; echo $?
1
所以 awk 的退出确实 sem 做我想做的事,但当从 shebang 脚本运行时则不然。
然后我尝试:
#!/bin/env awk -f
BEGIN { exit 1 }
$ ./test.sh ; echo $?
0
/bin/env: awk -f: No such file or directory
虽然我可以做到这一点......
#!/bin/sh
awk 'BEGIN { exit 1 }'
$ ./test.sh ; echo $?
1
然后,我在 vi 中释放了脚本的所有语法突出显示/操作(最多 200 行)。
同样,另一种选择是:
#!/bin/sh
awk -f $1
exit $?
但这需要管理 awk 脚本的路径以及包装可执行文件(${BASH_SOURCE[0]} 仅适用于 bash)。
理想情况下,我还想为 awk 设置“-W posix”选项,但这会增加更多的复杂性!
更新
在 OpenSuse 13 / awk 4.1.0 上运行上面的第一个脚本我得到了预期的结果(遗憾的是这并没有真正解决问题)
答案1
您没有提到您正在运行哪个操作系统或您正在使用哪个版本的 awk,但是在尝试使用 GNU awk (4.1.1) 在我的 Linux 主机上重现您的问题时,它对我来说效果很好。鉴于:
#!/bin/awk -f
BEGIN { exit 1 }
当放入文件中时test.sh
会导致:
$ ./test.sh
$ echo $?
1
我同意评论者的观点,他说这test.sh
对于脚本来说是一个奇怪的名称awk
。我会使用.awk
扩展来明确它实际上不是 shell 脚本。
更新
在 RHEL 6.7 上:
$ rpm -q redhat-release-server
redhat-release-server-6Server-6.7.0.3.el6.x86_64
使用 awk:
$ awk --version
GNU Awk 3.1.7
一切看起来都很好。剧本:
$ cat test.awk
#!/bin/awk -f
BEGIN {exit 1}
结果:
$ ./test.awk
$ echo $?
1