web-dev-qa-db-ja.com

もし、そうでなければ、grepにパイプされたコマンドに基づく

この(単純なはずの)スクリプトを機能させる方法がわかりません。基本的には、Parallels vmの状態に基づいてさまざまなものを実行するには、次のようにします。

if [ prlctl list --info ubuntu-vm | grep State == "State: running" ] ; then 
   echo 'machine is running'
else
   echo 'machine is not running'
fi

もちろん、それは機能しません

7
iLemming

問題は、すべてを[、つまりtestコマンド内に配置することです。さらに、grepの使用法が壊れています。

あなたに必要なのは:

if prlctl list --info ubuntu-vm | grep -q "State: running"; then
   echo 'machine is running'
else
   echo 'machine is not running'
fi

grepの引数として-qが使用されていることに注意してください。 STDOUTには何も書き込まず、一致が見つかった場合はステータス0で終了し、それ以外の場合はゼロ以外で終了します。

14
devnull

代替チェック。「クリーン」ではありませんが、質問が達成しようとしたものに近いものです。

コアの_[_は単なるコマンドであることを忘れないでください。他のすべてのコマンドと同様に、常に特定の数のパラメーターを受け入れ、0(成功)または1(失敗)のいずれかの終了ステータスで終了します。たとえば、2つの文字列を比較する場合、構文はis _[_、string 1、_==_、string 2、_]_です。

現在、これをif条件として使用しています:

_[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
_

しかし、それはいくつかの点であいまいです。 _[_では、左側に固定文字列ではなく、実行するコマンドがあることをどのようにして知っていますか? _==_がgrepへの単なる引数ではなく、文字列比較演算子であることをどのようにして知るのでしょうか。コマンドを_|_と_[ prlctl list --info ubuntu-vm_に分割するのではなく、_grep State == "State: running" ]_が左側の値の一部であることをどのようにして知ることができますか?

したがって、左側も引用する必要があります。また、ワールドの「prctl list --info ...」自体ではなく、そのコマンドのoutputを比較するため、$(…)演算子が必要です。

_[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]
_
3
user1686