bashのif testとfindコマンドを同時に使用するには?

bashのif testとfindコマンドを同時に使用するには?

競合ログを含むディレクトリがあり、findコマンドに基づいてbashスクリプトで条件文を使用したいと思います。

ログファイルは次の形式で保存されます。

/var/log/crashes/app-2012-08-28.log
/var/log/crashes/otherapp-2012-08-28.log

過去5分以内に修正された特定のアプリケーションの競合ログがある場合にのみ、ifステートメントがtrueを返すようにしたいと思います。find私が使用するコマンドは次のとおりです。

find /var/log/crashes -name app-\*\.log -mmin -5

if私はこれを声明に適切に含める方法を知りません。私の考えでは、これがうまくいくようです:

if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then
 service myapp restart
fi

私がよく理解していないいくつかのことがあります。

  • 私は見たことがないフラグがある場合しかし、どのようなものを使うべきかはよくわかりません。
  • そのディレクティブが必要ですかtest、それともfindコマンドの結果を直接処理する必要がありますか、それともそれを使用してfind... | wc -l行数を取得できますか?
  • この質問に100%答える必要はありませんが、testコマンドから返された戻りコードをテストするためのものですか?見えないか。内部stdout/外部stderr?ページを読みmanましたが、いつ使用しtestてデバッグするかはまだ明確ではありません。

ベストアンサー1

[test同義語([requireを除く])なので、以下を使用したくありません[ test

[ -x /bin/cat ] && echo 'cat is executable'
test -x /bin/cat && echo 'cat is executable'

test条件が true の場合は終了状態 0 を返し、そうでない場合は 0 以外の値を返します。これは実際に終了ステータスを確認するプログラムに置き換えることができます。ここで、0 は成功を意味し、0 以外の場合は失敗を意味します。

# echoes "command succeeded" because echo rarely fails
if /bin/echo hi; then echo 'command succeeded'; else echo 'command failed'; fi

# echoes "command failed" because rmdir requires an argument
if /bin/rmdir; then echo 'command succeeded'; else echo 'command failed'; fi

ただし、上記の例はすべてプログラムの終了状態のみをテストし、プログラムの出力を無視します。

の場合、find出力が生成されるかどうかをテストする必要があります。-n空でない文字列をテストします。

if [[ -n $(find /var/log/crashes -name "app-*.log" -mmin -5) ]]
then
    service myapp restart
fi

help testテストパラメータの完全なリストは、コマンドラインから呼び出すことで取得できますbash

これは、条件にスペースやその他の特殊なケースがある場合、より予測可能に動作するbash(代わりにsh)を使用すると機能します。[[ condition ]]それ以外の場合は、通常を使用するのと同じです[ condition ]。この例ではこれを使用し、[[ condition ]]可能な限り使用します。

また、一般的に同様に動作しますが、入れ子になったコマンドをより良いに`command`変更しました。$(command)

おすすめ記事