問題は、すべてを [ 内に配置していることです 、つまり test 指図。さらに、あなたの grep の使い方
必要なのは:
if prlctl list --info ubuntu-vm | grep -q "State: running"; then
echo 'machine is running'
else
echo 'machine is not running'
fi
-q の使い方に注意してください grep への引数として . STDOUT には何も書き込まず、一致が見つかった場合は 0 のステータスで終了し、そうでない場合は 0 以外のステータスで終了します。
「クリーン」ではありませんが、質問が達成しようとしたことに近い代替チェックです。
[ を覚えておいてください その核心は単なるコマンドです。他のすべてのコマンドと同様に、常に特定の数のパラメーターを受け入れ、0 (成功) または 1 (失敗) の終了ステータスで終了します。たとえば、2 つの文字列を比較する場合、構文は [ です。 、文字列 1、== 、文字列 2、] .
現在、これを if として使用しています 状態:
[ prlctl list --info ubuntu-vm | grep State == "State: running" ]
しかし、それはいくつかの点であいまいです。どのように [ 左側には実行するコマンドがあり、固定文字列ではないことを知っていますか? == であることをどうやって知るのでしょうか grep の単なる引数ではなく、文字列比較演算子です ? | であることをどうやって知るのでしょうか? コマンドを [ prlctl list --info ubuntu-vm に分割するのではなく、左側の値の一部です と grep State == "State: running" ] ?
したがって、左側も引用する必要があります。また、出力を比較したいので そのコマンドでは、世界の "prctl list --info..." 自体ではなく、$(…) が必要です。 オペレーター:
[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]