2013-06-18 85 views
5
cplane_pid=`pidof hnb_gw.exe` 
    if [ -z $cplane_pid ] 
    then 
     STATUS=`failure` 
     echo "Cplane hnbgw running  $STATUS" 
    else 
     STATUS=`success` 
     echo "Cplane hnbgw running  $STATUS" 
    fi  
    echo 
+0

考慮重構,以便在if塊中設置$ STATUS,並且echo之後。 – icedwater

回答

4

如果存在的hnb_gw.exe多個實例,會的pidof返回多個的PID。 [-z預計只有一個PID。一種解決方案可能是使用pidof的-s開關僅返回一個pid。

+0

實際上,當它另一方面返回none時,會有兩個參數('-z'只是檢查參數是否爲空)。更多的引號似乎是更好的解決方案 –

+0

你說得對,引號是好的,但這不是問題的原因。 – urzeit

+2

嗯,是的。 '-z'不期望只有一個pid。它期待一個空的或非空的論點。因此,只有一個pid不是想要的。準確地獲取一個字符串並且需要引號。 –

0

pidof可以返回多個pid,在這些情況下,您的測試會得到太多的參數。

4

您需要Use More Quotes™

if [ -z "$cplane_pid" ] 

添加set -x之前和set +x該命令會顯示你以後是什麼導致,例如:

$ cplane_pid="1 2 3" 
$ set -x 
$ [ -z $cplane_pid ] 
+ '[' -z 1 2 3 ']' 
bash: [: too many arguments 

換句話說,每個的變量中用空格分隔的值被用作單個參數。由於-z只需要一個參數,因此會導致語法錯誤。

而不是保存這是一個變量,你可以簡單地做

if ! pidof hnb_gw.exe > /dev/null 

如果進程不存在,則返回1(「假」)。

1

當你執行

cplane_pid=`pidof hnb_gw.exe` 

然後cplane_pid可以包含多個(用空格隔開)項目。

所以在

if [ -z $cplane_pid ] 

擴張將成爲

if [ -z firstPid secondPid etc ] 

,這是你的錯誤"[: too many arguments"

你可以用引用變量解決這個問題(你應該在外殼做到這一點ALWAYS )

if [ -z "$cplane_pid" ] 

或使用[[(如果它安裝在您的系統上),這在很多方面都更好。舉例來說,你不需要引用變量:)

if [[ -z $cplane_pid ]] 

相同

if [[ -z "$cplane_pid" ]] 

出於測試目的(而像這樣的錯誤回報)使用-x hasbang bash的選項

#!/bin/bash -x 

或使用調試部分

-- normal code -- 
set -x # debug section starts here 
[ -z $cplane_pid ] && echo zero 
eval something 
set +x # debug section ends here 
-- normal code -- 

你也可以調用腳本

/bin/bash -x yourScript.sh 
+0

'sh:2:[[:找不到'(好吧,在cygwin中'/ bin/sh'總是bash,所以會起作用;大多數unices不是這樣) –

+0

Tha's why why we more more solutions :) jinak zdravim,洪佐:) – bartimar