如何用Gawk实现类似Bash中cat "$0"的脚本自打印功能?
在Gawk中实现无需传参即可打印脚本自身的功能
要实现和Bash脚本cat "$0"相同的效果,你可以利用Gawk的BEGIN块主动读取脚本自身文件,并通过修改内置变量避免处理额外参数。以下是修正后的脚本:
#!/usr/bin/awk -f BEGIN { # 循环读取脚本自身的每一行并打印 while ((getline line < ARGV[0]) > 0) { print line } close(ARGV[0]) # 将ARGC设为0,阻止Gawk处理任何传入的位置参数 ARGC = 0 }
解决原脚本的两个问题:
- 避免打印传入参数内容:通过设置
ARGC = 0,Gawk会忽略所有传入的位置参数,不会读取并打印这些参数对应的文件内容。 - 无需传参即可执行:在
BEGIN块中直接读取ARGV[0](当前脚本的路径,使用-f选项运行时会自动赋值),不需要依赖外部传入的文件名参数,运行./cat-itself.awk即可直接输出脚本自身。
原理说明:
ARGV[0]是Gawk的内置数组元素,在通过-f执行脚本时,会被设置为当前脚本的路径,这是获取脚本自身位置的可靠方式。getline用于从指定文件(此处为脚本自身)读取内容,循环执行直到文件读取完毕。close()用于关闭打开的文件,避免资源泄漏。ARGC表示命令行参数的数量,将其设为0后,Gawk不会尝试处理ARGV数组中的其他参数。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

