Linux #awk If else循环在ksh中不工作
我有一段代码,其中awk通过管道传输到clearcase命令,而If-else循环不起作用 代码如下:Linux #awk If else循环在ksh中不工作,linux,shell,unix,awk,clearcase,Linux,Shell,Unix,Awk,Clearcase,我有一段代码,其中awk通过管道传输到clearcase命令,而If-else循环不起作用 代码如下: #!/bin/ksh export dst_region=$1 cleartool lsview -l | gawk -F":" \ '{ if ($0 ~ /Global path:/) { if($dst_region == "ABC" || $dst_region -eq "ABC") { system("echo dest_region is ABC");} else
#!/bin/ksh
export dst_region=$1
cleartool lsview -l | gawk -F":" \ '{ if ($0 ~ /Global path:/) { if($dst_region == "ABC" || $dst_region -eq "ABC") { system("echo dest_region is ABC");}
else { system("echo dest_region is not ABC"); } }; }'
但是当我执行上面的脚本时,我得到了错误的输出
*$ ksh script.sh ABCD
dest_region is ABC
$ ksh script.sh ABC
dest_region is ABC*
有人能在这个问题上提供帮助吗?如果您能准确地解释您要做的事情,这将非常有用,但是您的awk脚本可以被清理很多:
gawk -F":" -vdst_region="$1" '/Global path:/ { if (dst_region == "ABC") print "dest_region is ABC"; else print "dest_region is not ABC" }'
一般要点:
- 我使用
从脚本的第一个参数-v
的值创建了一个awk变量。这意味着您可以在脚本中更轻松地使用它$1
- awk的结构是
,因此不必要地在整个一行程序中使用condition{action}
if
可以简单地更改为$0~/Global path://
/Global path://
的两面看起来好像都在尝试做相同的事情,所以我去掉了在awk中不起作用的一面。使用|
比较字符串==
完全没有必要。使用awk内置的系统(“echo…”)
print
if-else
:
gawk -F":" -vdst_region="$1" '/Global path:/ { printf "dest region is%s ABC", (dst_region=="ABC"?"":" not") }'
您能否提供一些来自
cleartool lsview-l
的示例输出,并解释您试图执行的操作?您似乎混淆了该awk脚本中的awk
语法和shell语法awk
变量在使用时不需要$
(位置变量和间接求值条件除外)-eq
是一个shell条件测试(对于test
/[
)而不是awk
条件测试。$dst_region
在代码段中是一个shell变量,但在awk脚本中使用(因为您将awk脚本包装在单引号中,从而阻止了shell变量的扩展,所以它不起作用)。是的,我对shell变量和awk变量之间的变量感到困惑。正如您所说的单引号阻止了shell变量的扩展,我需要创建awk变量以进行正确的变量值分配,谢谢您,VonCWorked like charm!!!这个问题通过在awk命令中使用“-v”创建变量来解决并将命令行参数指定给它。谢谢你,汤姆。