실행 된 명령의 결과에서 if 문을 수행하는 방법 작동하지 않습니다. 누구든지 올바른

실행 된 명령의 출력에서 ​​IF 문을 수행하려고합니다. 여기에 내가 시도하는 방법이 있지만 작동하지 않습니다. 누구든지 올바른 방법을 알고 있습니까?

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


답변

bash [[조건부 구성을 사용하고 $(<command> )명령 대체 규칙을 선호하십시오 . 또한 [[변수 값의 워드 분할을 방지하므로 명령 대체 비트를 인용 할 필요가 없습니다.

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

답변

또 다른 대안은 단순히 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