我需要能够运行脚本并传入参数(日期和月份),例如
$root# ./myscript -v 31 12
但我似乎无法找到任何合适的方法将命令行参数传递到 bash 变量 X 中的 awk 命令,而不会导致脚本阻塞。我试过用双引号允许变量插值,如 Stack Overflow 上其他地方所述,用反斜杠转义其他美元符号,但无济于事。
#!/bin/bash
X=$(./some_script | awk -v VARIABLE="$1" '$1 == "VARIABLE" | awk '{print $1,$2,$3}')
Y=$(./other_script | awk -v VARIABLE="$2" '$1 == "VARIABLE" | awk '{print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")
这是阻塞脚本并返回错误
awk: syntax error near line 1
awk: bailing out near line 1
已解决 似乎标准的 Solaris“AWK”不接受 -v 标志,并且该特定错误在某种程度上传达了它。用 nawk 切换它,它运行良好,如下所述。 @David_W 详细介绍了有关 nawk/awk 参数传递的信息。非常感谢@Ed_Morton 发现错误,感谢@anubhava 和@hek2mgl 提供概念验证。
#!/bin/bash
echo
X=$(./some_script | nawk -v VARIABLE="$1" '$1 == "VARIABLE" {print $1,$2,$3}')
X=$(./other_script | nawk -v VARIABLE="$1" '$1 == "VARIABLE" {print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")
最佳答案
根据 awk
的版本,有两种将环境变量传递到 awk
的方法:
较新版本的 awk
(有时在 Solaris 系统上称为 nawk
):
$ awk -v var1="$var1" -v var2="$var2" prog.awk
旧版本的 awk 让你在最后设置变量:
$ awk prog.awk var1="$var1" var2="$var2"
我不能 100% 确定最后一个是否完全按照它的方式完成。我已经 20 多年没有使用旧版本的 awk
了。甚至 Solaris 也允许您通过调用 nawk
或使用 /usr/xpg4/bin
中的版本来使用较新版本的 awk
(我建议将其放在 /bin
和 /usr/bin
之前的 $PATH
中。这样,来自其他操作系统的 shell 脚本如Mac OS X 和 Linux 更有可能以兼容的方式工作。)
来自 Solaris XPG4(第 5 节)联机帮助页:
If the behavior required by POSIX.2, POSIX.2a, XPG4, SUS, or SUSv2 conflicts with historical Solaris utility behavior, the original Solaris version of the utility is unchanged; a new version that is standard-conforming has been provided in
/usr/xpg4/bin
. For applications wishing to take advantage of POSIX.2, POSIX.2a, XPG4, SUS, or SUSv2 features, thePATH
(sh
orksh
) orpath
(csh
) environment variables should be set with/usr/xpg4/bin
preceding any other directories in which utilities specified by those specifications are found, such as/bin
,/usr/bin
,/usr/ucb
, and/usr/ccs/bin
.
关于linux - 将 Bash 参数传递给封装 AWK 命令的 Bash 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24885539/