2013-01-08 99 views
2

我在下面的腳本中遇到了一些麻煩。從expect/tcl向perl腳本傳遞多個參數

proc checkUser {userip} { 
    set search "show users | include " 
    set search_cmd [concat $search $userip] 
    exp_send "$search_cmd\r" 

    expect { 
     -re "Vi.*" { 

      set oui "uei.opennms.org/services/passiveServiceStatus" 
      set host "localhost" 
      set iface "--interface $userip" 
      set service "--service Test" 
      set parm1 "--parm 'passiveNodeLabel [getNodeName $userip]'" 
      set parm2 "--parm 'passiveIpAddr $userip'" 
      set parm3 "--parm 'passiveServiceName Test'" 
      set parm4 "--parm 'passiveStatus Up'" 

      send_user [ exec perl /opt/opennms/bin/send-event.pl $oui,$host,$iface,$service,$parm1,$parm2,$parm3,$parm4 ] 
      #send_user [ exec [pwd]] 

     } 
    } 
} 

整個Expect腳本執行沒有錯誤,但是所謂的似乎並不當我與它做什麼,它該做的相同參數的bash運行perl腳本執行但Perl腳本。

這是從Expect中調用perl腳本的正確方法嗎?

在此先感謝。

回答

3

寫入的程序將參數傳遞給Perl腳本,作爲一個用逗號分隔的塊的大參數。雖然這通常是合法的,但這可能不是Perl程序需要的!相反,把空間在中間,這樣的價值觀是Tcl的一級獨立參數,它們將在Perl的水平也成爲單獨的命令行參數:

exec perl /opt/opennms/bin/send-event.pl $oui $host $iface $service $parm1 $parm2 $parm3 $parm4 

而且,看來你有多個每個Tcl變量的參數,並且你正在嘗試在它們內部使用shell引用。那是更錯了。你會好得多寫這樣的代碼:

expect { 
    -re "Vi.*" { 
     set oui "uei.opennms.org/services/passiveServiceStatus" 
     set host "localhost" 

     send_user [ exec perl /opt/opennms/bin/send-event.pl $oui $host \ 
       --interface $userip \ 
       --service "Test" \ 
       --parm "passiveNodeLabel [getNodeName $userip]" \ 
       --parm "passiveIpAddr $userip" \ 
       --parm "passiveServiceName Test" \ 
       --parm "passiveStatus Up" ] 
    } 
} 

每個參數的字是用Tcl自己的話。我已經使用了反斜槓 - 換行符來使事情更清晰。我們使用雙引號,以便在處理替換時可以嵌入空格,但如果您需要奇怪的東西,請將{大括號}或使用反斜槓。

+0

工作就像一個魅力:)非常感謝Donal – SneakyMummin