Linux #awk If else循环在ksh中不工作

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

我有一段代码,其中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 { 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
    从脚本的第一个参数
    $1
    的值创建了一个awk变量。这意味着您可以在脚本中更轻松地使用它
  • awk的结构是
    condition{action}
    ,因此不必要地在整个一行程序中使用
    if
  • $0~/Global path://
    可以简单地更改为
    /Global path://
  • |
    的两面看起来好像都在尝试做相同的事情,所以我去掉了在awk中不起作用的一面。使用
    ==
    比较字符串
  • 系统(“echo…”)
    完全没有必要。使用awk内置的
    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”创建变量来解决并将命令行参数指定给它。谢谢你,汤姆。