問題は、すべてを [
内に配置していることです 、つまり 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" ]