2014-09-10 36 views
1

我有代碼,其中awk通過管道傳輸到clearcase命令,其中If else循環不起作用。#awk如果其他循環不能在ksh中工作

代碼如下:

#!/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* 

任何人都可以請有關此問題的幫助?

+1

你能從'cleartool lsview -l'提供一些樣本輸出和解釋你要什麼做? – 2014-09-10 09:25:58

+0

您似乎在awk腳本中混淆了'awk'語法和shell語法。 'awk'變量在使用時不需要'$'(除了位置和間接評估條件)。 '-eq'是一個shell條件測試(對於'test' /'''不是'awk'條件。 '$ dst_region'是你的代碼片段中的一個shell變量,但正在awk腳本中使用(並且因爲你將awk腳本包裝在單引號中阻止shell變量擴展),因此不在那裏工作。 – 2014-09-10 09:46:35

+0

是的,我對shell變量和awk變量之間的變量感到困惑。正如你所說的,單引號阻塞了shell變量擴展,我需要爲適當的變量賦值創建awk變量,謝謝VonC – 2014-09-11 06:39:53

回答

1

如果你解釋正是你正在嘗試做的,但你的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中不起作用的那個。字符串使用==進行比較。
  • system("echo ...")是完全不必要的。使用awk的內置print

你可以走一步並刪除if-else完全:

gawk -F":" -vdst_region="$1" '/Global path:/ { printf "dest region is%s ABC", (dst_region=="ABC"?"":" not") }' 
+0

像魅力一樣工作!在awk命令中使用「-v」創建變量併爲其分配命令行參數,從而解決了該問題。謝謝湯姆。 – 2014-09-11 06:31:26