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


54

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

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

回答:


65

bash [[条件付き構成を使用し、$(<command> )コマンド置換規則を優先します。さらに、[[変数値の単語分割を防ぐため、コマンド置換ビットを引用する必要はありません。

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

30

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

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

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


12
-q/ dev / nullにリダイレクトする代わりに、grep のオプションに注意してください。を使用すると-q、grepは何も出力せず、最初の一致後に検索を停止します。
ステファンシャゼル

5

さらに簡単に、

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

あなたがただ一つのことをしたい場合。


4

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

0

別の実世界の例:)

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

何をHEADするの?それはシステム上のカスタム関数またはエイリアスですか?
luckman212

usr/bin/HEAD → lwp-request。そしてlwp-requestはこれのようです。わからない、どうやってそこに来たのか(手動ではわかりません)、デフォルトですべてがそこにあるかどうか。小文字usr/bin/head もあるようです。
フランクノッケ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.