実行したコマンドの出力からIFステートメントを実行しようとしています。これが私がそれをやろうとしている方法ですが、それはうまくいきません。誰かがこれを行う正しい方法を知っていますか?
if [ "`netstat -lnp | grep ':8080'`" == *Java* ]; then
echo "Found a Tomcat!"
fi
Bashを使用する[[
条件付きコンストラクトと$(
<コマンド> )
コマンド置換規約。さらに、[[
は、変数値のWord分割を防止するため、コマンド置換ビットを引用符で囲む必要はありません。
if [[ $(netstat -lnp | grep ':8080') = *Java* ]]; then
echo "Found a Tomcat!"
fi
もう1つの方法は、[
コマンドを使用せずに、grep
自体の終了ステータスを単にテストすることです。一致がない場合はfalse(1)、一致した場合はtrue(0)を返します。 。
if netstat -lntp | grep ':8080.*Java' > /dev/null; then
echo "Found a Tomcat!"
fi
/ dev/nullへのリダイレクトは、見つかった行を画面に出力しないようにするためです。
さらにシンプルです
netstat -lntp | grep ':8080.*Java' > /dev/null && command
あなたがただ一つしたいのなら。
より正確でシンプルな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