アイシング用のイベントハンドラを作成しようとしています。私の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
決して実行されませんecho
。then
誤ってキーワード間にコンテンツを追加しないようにするには、キーワードを条件と同じ行に配置することをお勧めします。
if
条件付きで複数のコマンドを使用するのは混乱する可能性がありますが、while
これを使用すると次のような用途があります。
while value=$(somecommand) ; [ "$value" != 0 ] ; do
echo "do some work with $value"
done
割り当てとテストはどちらもループが繰り返されるたびに実行されます。