실행 된 명령의 결과에서 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

또 다른 대안은 단순히 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은 아무것도 출력하지 않으며 첫 번째 일치 후 검색을 중지합니다.
Stéphane Chazelas

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 요청은 것으로 보인다 이것 . 확실하지 않습니다. 기본적으로 모든 것이 있는지에 대한 방법 (수동으로 확실하지는 않음). 소문자 usr/bin/head 도있는 것 같습니다 .
Frank Nocke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.