コマンドの出力が「3」であることを確認するスクリプトを作成します。

コマンドの出力が「3」であることを確認するスクリプトを作成します。

コマンドを実行するスクリプトを作成しようとしていますが、コマンドの出力が3の場合はスクリプトを終了する必要があります。3以外の場合、スクリプトは数が3でないことを示す電子メールを送信する必要があります。以下にこのコードを書いていますが、何らかの理由で実行するたびに出力が3ですが、3ではないという電子メールが届きます。

#!/bin/bash

Server_Count=""
   nslookup servers | grep -i "Address: 10" | wc -l > /dev/null
   if [ $? == 3 ]; then
       Server_Count="$?"
else
   echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]

fi

答え1

$?前のコマンドの結果ではなく、前のコマンドの終了コードです。したがって、コマンドが成功したと仮定すると$?ゼロになります。

コマンド置換をしたい。

#!/bin/bash

server_count=$(nslookup servers | grep -i "Address: 10" | wc -l)
if [[ "$server_count" -ne 3 ]]; then
  echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]
fi

server_countこれは結果に設定されるため、wc -lif文でリセットする必要はありません。だから私はifチェックを無効にしました(サーバーが重要な場合確かに電子メールを送信するには3です。そうでなければ何もしません。)

ここでは、整数比較の正しい検査である-ne検査も使用されます。

参考までに、[ ... ]bash比較演算子と一緒にPOSIXシェルを使用してテストしています==。これはまだ多くのシステムで機能しますが、使用する場合は使用する必要が[ ... ]あり=、使用する場合はまたは[[ ... ]]使用できます。===

答え2

Jesse_bが説明したようにwc -l、返されたデータではなく戻り状態を見ているため、コードは機能しません。

if nslookup servers | grep -c -iF "Address: 10" | ! grep -q -xF 3; then
    echo 'Server count is not 3... please check' | mail -s 'Server count issue' [email protected]
fi

これにより、指定された文字列に一致する出力の行数を計算して変数に項目を保存する必要がなくなり、その数がnslookup正確に3つでない場合は電子メールが送信されます。

を使用すると、与えられた-cパターンgrepに一致する行数を出力します。 grepの出力生成を-q停止するオプションですgrep。ここでは、grep一致するものがあるかどうかを考慮し、3戻り状態で確認します。-x行全体を強制的に一致させます(つまり、一致せずに一致させます330。この-Fオプションを使用すると、grep正規表現一致ではなく文字列一致が有効になります。

関連情報