コマンドを実行するスクリプトを作成しようとしていますが、コマンドの出力が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 -l
if文でリセットする必要はありません。だから私は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
行全体を強制的に一致させます(つまり、一致せずに一致させます3
)30
。この-F
オプションを使用すると、grep
正規表現一致ではなく文字列一致が有効になります。