2013-06-18 20 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

$ STATUSがifブロックに設定され、エコーが来るようにリファクタリングを検討してください。 – icedwater

答えて

4

hnb_gw.exeのインスタンスが複数ある場合、pidofは複数のpidを返します。 -z[の場合、pidは1つだけです。 1つの解決策は、pidofのスイッチ-sを使用して、pidを1つだけ返すことです。

+0

実際には、2つの引数があり、一方ではnoneを返します( '-z'は引数が空であるかどうかをチェックするだけです)。より多くの引用符がここではより良い解決策であるようです –

+0

あなたは引用符が優れているという点では正しいですが、それは問題の理由ではありませんでした。 – urzeit

+2

さて、そうだった。 '-z'は単なるpidを期待していません。それはちょうど1つ、空または空ではない引数を期待しています。したがって、1つだけのPIDを得ることは、求められることではありません。正確に1つの文字列を取得することは、引用符を必要とします。 –

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には1つのパラメータが必要なため、構文エラーが発生します。

プロセスが存在しない場合は、変数としてこれを保存し、あなたは、単に

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"

あなたのエラーです)

if [ -z "$cplane_pid" ] 

または[[(システムにインストールされている場合)を使用してください。これはさまざまな点で優れています。たとえば、あなたは、変数引用する必要はありません:)

if [[ -z $cplane_pid ]] 

はテスト目的(及び、このようなerros)については

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なので、ほとんどのユニークではうまくいきません) –

+0

私はより多くの解決策を述べました:) jinak zdravim、本荘:) – bartimar

関連する問題