スクリプトの実行時にログファイルを生成します。
同じログファイルに「Msg....」を含むメッセージと終了コード(「Msg 2714」以外)があることを確認したいと思います。
だから私はスクリプトに次のコードを追加しました。
Some line of code before
rc1=`grep -v 'Msg 2714' $Logfilename`
rc2=`grep -i 'Msg' $rc1`
if [ $rc2 -ne "" ]
then
echo "Error message, some query has failed"
exit
fi
ただし、2番目のgrepがnullを返しても終了コード/返却コードは「1」なので、「コマンドが失敗してスクリプトが存在する場合」grepコマンドに問題があります。
ここに問題がある場合、提案はありますか?
ありがとうございます!
答え1
スクリプトは値を$rc1
ファイル名として使用しますが、これは出力ですgrep
。
最初の出力をgrep
別の出力に供給するには、grep
パイプを使用してください。
grep -v ... filename | grep ...
結果をin変数grep
(大規模にすることができます)に保存する代わりに、if
このパイプライン実行の結果に対してテストが直接機能するようにします。
if grep -v -F 'Msg 2714' "$Logfilename" | grep -q -F Msg; then
echo 'Error message, some query has failed' >&2
exit 1
fi
これはパイプの終了状態(の終了状態grep -q
)を使用して、スクリプトがエラーメッセージを出力して終了するかどうかを決定します。変数にデータを保存する必要はありません。
grep -q
何も出力されませんが、与えられたパターンが一致すると正常に終了します。また、正規表現ではなく文字列を一致させるため、-F
2回の呼び出しを使用しました。grep
また、標準エラーストリーム(echo ... >&2
この場合)でエラーメッセージが生成され、致命的なエラーが発生すると、スクリプトがゼロ以外の終了状態で終了するという一般的なガイドラインにも従います。
変数拡張を引用しないことに関連している可能性があります。