不幸的是,这并不容易以便携的方式解决。标准技术如下所示(代替/usr/bin/awk
您的 awk 路径):
#!/usr/bin/awk -f
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
硬编码的awk
路径和非标准-f
标志,使得它不能在所有 *nixes 中移植。如果您只打算在一台机器上运行您的脚本,那么这可能工作正常。但是,要制作可移植awk
脚本,您需要将其包装在 shell 脚本中。以下是您可以在一个文件中执行此操作的两种方法:
第一种方式是标准且易于阅读的:
#!/bin/sh
awk '
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
' "$@"
不幸的是,这在两个关键方面有所不足:
- 如果您的 awk 脚本包含一个
'
字符,您需要像这样键入它:'"'"'
“转义”它。
- 如果您使用带有语法突出显示的文本编辑器,您将无法正确突出显示您的 awk 脚本。
另一种解决方案是使用sed
剥离sh
包装器:
#!/bin/sh
exec awk "$(sed '1,2d' "$0")" "$@"
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
这有点像两行 shabang 标题。它使用第 3 行以下的文件作为脚本参数调用 awk。这使您可以保持漂亮的语法突出显示,并且您仍然可以随心所欲'
地使用字符。我看到的两个缺点是:
- 可以说这是不直观的阅读。
- 如果您使用的是代码 linter,它可能不会这样。