web-dev-qa-db-ja.com

grepの結果をbashで評価する方法は?

サービスの特定のステータス(Tomcat8.service)をgrepしたい。

文字列が見つかった場合にのみ、いくつかのロジックを実行します。

問題:存在しないサービス名(この例では「asd」)でスクリプトを実行しても、if $statusは一致し、出力されます。しかし、なぜ?

status = $(systemctl status asd.service | grep 'active')
echo $status

if $status
then 
    echo "$SERVICE was active"
    exit 0
fi 
exit 0

結果の出力はasd.service was activeです。これは確かに正しくありません。

echo $statusの印刷:status: Unknown job: =

2
membersound

Grepの戻りステータスを利用できます。

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

またはさらに簡単:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

またはifを希望する場合:

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

とにかく、キーワードinactivenot activeactive (exited)などに注意してください。これは、grepステートメントとも一致します。コメントを参照してください。ヒントをありがとう@ Terrance。


更新:

Grepは必要ありません。 systemctlにはコマンドis-activeが含まれています。

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

または:

if systemctl -q is-active asd.service; then
    echo "is active";
fi
2
pLumo

コードレビューのコメント:

  • sh/bash/ksh/zsh変数の割り当てはvar=valueのように見えます-=の周りにスペースを入れることはできません。 ( ドキュメント
  • status=$(some command)-ステータス変数は、終了ステータスではなく、コマンドのoutputを保持します。終了ステータスは$?変数にあります
  • ifステートメントは、次のコマンドの終了ステータスに作用します(- documentation

    if some_comment; then action1; else action2; fi
    

    ほとんどの場合、コマンドは[または[[で、何らかの条件をテストします。

    ただし、grepの終了ステータスは明確です。パターンが見つかった場合は0、それ以外の場合は1です。あなたはこれが欲しい:

    if systemctl status asd.service | grep -q 'active'; then
        echo "$SERVICE was active"
    fi
    
0
glenn jackman