Bash:If / Elseステートメントを1行で


204

some_processサーバーでプロセス(と呼ばれていると仮定)が実行されているかどうかを確認しようとしています。ある場合は1をエコーし​​、それ以外の場合は0をエコーし​​ます。

これは私が使用しているコマンドですが、部分的にしか機能しません(詳細は以下を参照)。スクリプトは1行で記述する必要があることに注意してください。

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

注:[s]ではsome_proces[s]ないようにすることであるgrep自分自身を返すから。

some_process実行中の場合、"1"エコーされますが、問題ありません。ただし、some_processが実行されていない場合、何もエコーされません。


4
を使用ps -Ccmdして、コマンド名が「cmd」であるプロセスを検索できますgrep。これにより、を完全に排除できます。ps一致するプロセスが見つからない場合、終了コードをゼロ以外の値に設定します。
rici 2013年

回答:


273

明示的にチェックする必要はありません$?。ただやる:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

これはエコーが失敗しないことに依存していることに注意してください。これは確かに保証されていません。これを書くためのより信頼できる方法は:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi

9
echo 1失敗した場合は、echo 0実行されます。この場合、エコー1は失敗しませんが、A && B ||に注意してください。Cはif-then-elseではありません。AがtrueのときにCが実行される場合があります(shellcheckから)。
schemacs 2014

@schemacsは非常に有効なポイントになります。はるかに優れた代替手段を提供するための編集。
ウィリアムパーセル2014

2
psコマンドの出力をファイルにリダイレクトする必要がありますか?これはうまくいきませんか?if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi。ローカルではそれは私のために働くようです。それは、OPが彼が試したコマンドにリダイレクトがあったからですか?

1
出力をリダイレクトする必要はまったくありません。理由のために出力が保存されていることを想定しているので、元の位置を単純に類推します。多くの場合、この種のことは単に抑制されます(grep -q/ dev / null によって、または/ dev / nullにリダイレクトされます)。
ウィリアムパーセル14

私は使用しますpgrep
pawciobiel、2016

67

&&「成功した場合」を意味します。ifステートメントを右側に配置することで、がgrep返され0た場合にのみ実行されるようになります。修正するには、;代わりに次を使用します。

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(または改行を使用します)。


6
+1これは、単に代替案を提供するのではなく、実際に質問に答えるため、はるかに良い答えです。
ウィリアムパーセル2014

41

出力でgrep -vc無視grepし、ps同時に行を数えるために使用します。

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi

15

次のように&&and ||演算子をフルに活用できます。

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

grep自体を除外するには、次のようにすることもできます。

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.