web-dev-qa-db-ja.com

実行されたコマンドの結果からifステートメントを実行する方法

実行したコマンドの出力からIFステートメントを実行しようとしています。これが私がそれをやろうとしている方法ですが、それはうまくいきません。誰かがこれを行う正しい方法を知っていますか?

if [ "`netstat -lnp | grep ':8080'`" == *Java* ]; then
  echo "Found a Tomcat!"
fi
65
djangofan

Bashを使用する[[条件付きコンストラクトと$( <コマンド> )コマンド置換規約。さらに、[[は、変数値のWord分割を防止するため、コマンド置換ビットを引用符で囲む必要はありません。

if [[ $(netstat -lnp | grep ':8080') = *Java* ]]; then
  echo "Found a Tomcat!"
fi
72
iruvar

もう1つの方法は、[コマンドを使用せずに、grep自体の終了ステータスを単にテストすることです。一致がない場合はfalse(1)、一致した場合はtrue(0)を返します。 。

if netstat -lntp | grep ':8080.*Java' > /dev/null; then
    echo "Found a Tomcat!"
fi

/ dev/nullへのリダイレクトは、見つかった行を画面に出力しないようにするためです。

34
Random832

さらにシンプルです

netstat -lntp | grep ':8080.*Java' > /dev/null && command

あなたがただ一つしたいのなら。

6
Rob Bos

より正確でシンプルなawkとのマッチングを行うことができます。

if netstat -lnp | awk '$4 ~ /:8080$/ && $7 ~ /Java/ {exit(0)} END {exit(1)}'; then …

コマンドの構造をより厳密に一致させるために、シェルで文字列に対してワイルドカード一致を実行する移植可能な方法は、case構成体を使用することです。

case "$(netstat -lnp | grep ':8080')" in
  *Java*)  echo "Found a Tomcat!";;
esac

別の実際の例:)

if [[ $(HEAD mycompany-intranet.com | grep '200\ OK' | wc -l) = "1" ]];  then
    echo doing some intranet settings (proxy, etc)
else
    echo doing some work-at-home settings (proxy, etc)
fi
0
Frank Nocke