これは私のコードです。
if grep -x $idle | grep -x $dead | grep -x $busy ./Event.log
then
echo " Events are running Successfully" >> ./Event.log
else
echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
次のエラーが発生します。
grep: 0652-033 Cannot open 1.
grep: 0652-033 Cannot open 0.
grep: 0652-033 Cannot open 0.
if
条件が満たされてもelse
ブロックに入ります。
誰が私を助けることができますか?
答え1
このコマンドgrep
には2つのパラメータがあります。模様そして文書。入力がパイプまたはリダイレクトを介して標準入力に接続されている場合は、|
このファイルを省略できます<
。あなたの例ではそうではないので、最初の人はgrep
パターンを見つける場所を知りません。次のように書く必要があります。
grep -x $idle Event.log | grep -x $dead | grep -x $busy
2番目と3番目のgrep
sはパイプから読み取られるため、ファイル引数は必要ありません。
しかし、あなたの場合は、3つの代替文字列を見つけるのが良いと思います。したがって、を|
使用または使用せずに代替演算子を使用できます。たとえば、次のようになります。grep -E
\|
-E
if grep -x "$idle\|$dead\|$busy" ./Event.log >/dev/null
then
echo " Events are running Successfully" >> ./Event.log
else
echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
答え2
正規表現を引用し(シェルワード分離規則を避けるため)、オプションを無効にし(正規表現の先行ハイフンがoptionsで処理されるのを避けるためgrep
)、標準入力がgrepされていることを正式に表示する必要があります。
$ x="hi there"; (echo hi there; echo bye there) | grep -- "$x" -
hi there
テスト条件の結果のみが必要な場合でも、-q
オプションがgrep
関連する可能性があります。