この(単純なはずの)スクリプトを機能させる方法がわかりません。基本的には、Parallels vmの状態に基づいてさまざまなものを実行するには、次のようにします。
if [ prlctl list --info ubuntu-vm | grep State == "State: running" ] ; then
echo 'machine is running'
else
echo 'machine is not running'
fi
もちろん、それは機能しません
問題は、すべてを[
、つまり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で終了し、それ以外の場合はゼロ以外で終了します。
代替チェック。「クリーン」ではありませんが、質問が達成しようとしたものに近いものです。
コアの_[
_は単なるコマンドであることを忘れないでください。他のすべてのコマンドと同様に、常に特定の数のパラメーターを受け入れ、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" ]
_