条件が常にtrueの場合、Bashスクリプト

条件が常にtrueの場合、Bashスクリプト

アイシング用のイベントハンドラを作成しようとしています。私のBashスクリプトは次のようになります。

#!/bin/bash
# Event Handler for loggin out inactive RDP users

# $1 is $SERVICESTATE$ (OK WARNING UNKNOWN CRITICAL)
# $2 is $SERVICESTATETYPE$ (SOFT HARD)
# $3 is $SERVICEATTEMPT$ (1 through 4)
# $4 is $SERVICDOWNTIME$ (0 no Downtime, >0 Downtime active)
# $5 is SRV29 
# $6 is $host.name$ (1 through 4)


if  [ "$4" > 0 ];
 echo "in downtime, exit";
 then exit
fi

case "$1" in
OK)
echo "ok!"
;;
WARNING)
echo "warning!"
;;
UNKNOWN)
echo "unknown!"
;;
CRITICAL)
echo "critical!"
...

上部にif文なしでこのスクリプトを実行すると、すべてがうまく機能します。しかし、$ 4が0より大きいことを確認したいと思います。このテスト条件は常に true を返し、この条件に何を入力しても常に「停止、終了」の結果が発生します。

だから、if [ "hello" = "hallo" ]すぐに入ってくるでしょう。私は引用符、二重括弧などを使用せずに引用符を使用してほぼすべてのバリエーションを試しました。私は明らかに何かが間違っています。誰でもそれを把握できますか?

よろしくお願いします!

答え1

整数をテストするには、次のものを使用する必要があります。

-eq  #Is equal
-ne  #Is not equal
-lt  #Less than
-le  #Less than or equal
-gt  #Greater than
-ge  #Greater than or equal

したがって、test宣言は次のようになります。

if  [ "$4" -gt 0 ];

また、お客様のif声明が欠落しているため、then次のように修正する必要があります。

if  [ "$4" -gt 0 ]; then

man testその他のオプションについては、リソースを参照してくださいtest

答え2

あなたのif声明はすべて回復しました。

if [ "$4" -gt 0 ]; then
   # stuff to do when $4 > 0
else
   # stuff to do when $4 <= 0
fi

答え3

if  [ ... ];
    echo "in downtime, exit";
    then exit
fi

他の回答で述べたように、thenこの場合、キーワードは間違った場所にありますif。 (シェル言語の観点からは、失われたものではありません。失われた場合、構文エラーが発生します。)

ここで何が起こっているのか両方前のコマンドはthen条件の一部と見なされ、コマンド全体の戻り値を使用して次の部分を実行するかどうかをthen選択します。セミコロンで区切られたコマンドの場合、最後のコマンドの終了状態のみが重要です。

echo成功は常に可能であるため、条件付き分岐は常に実行されます。しかし、そのようなことはif true; false; then echo something; fi決して実行されませんechothen誤ってキーワード間にコンテンツを追加しないようにするには、キーワードを条件と同じ行に配置することをお勧めします。

if条件付きで複数のコマンドを使用するのは混乱する可能性がありますが、whileこれを使用すると次のような用途があります。

while value=$(somecommand) ; [ "$value" != 0 ] ; do
    echo "do some work with $value"
done

割り当てとテストはどちらもループが繰り返されるたびに実行されます。

関連情報