我需要能够运行脚本并传入参数(日期和月份),如
$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")
答案 0 :(得分:1)
根据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允许您通过调用awk
代替nawk
或使用/usr/xpg4/bin
中的$PATH
来使用较新版本的/bin
(我建议您先放入/usr/bin
/usr/xpg4/bin
和PATH
。这样,来自其他操作系统(如Mac OS X和Linux)的shell脚本更有可能以兼容的方式工作。)
从Solaris XPG4(第5节)联机帮助页:
如果POSIX.2,POSIX.2a,XPG4,SUS或SUSv2所需的行为与历史Solaris实用程序行为冲突,则该实用程序的原始Solaris版本将保持不变;
sh
中提供了符合标准的新版本。对于希望利用POSIX.2,POSIX.2a,XPG4,SUS或SUSv2功能的应用程序,ksh
(path
或csh
)或/usr/xpg4/bin
({ {1}})环境变量应该在/bin
之前设置在找到这些规范指定的实用程序的任何其他目录之前,例如/usr/bin
,/usr/ucb
,/usr/ccs/bin
,和{{1}}。
答案 1 :(得分:0)
您可以使用awk -v name=val
将参数从shell传递给awk
:
试试这个:
#!/bin/bash
X=$(./some_script | awk -v val="HARDCODED" '$1 == val {print $1,$2,$3}')
Y=$(./some_other_script | awk -v val="HARDCODED" '$1 == val {print $1,$2,$3}')
echo '-------------RESULTS--------------'
echo
paste <(echo "$X") <(echo "$Y")