Bash : 한 줄에 If / Else 문


204

프로세스 (라고 가정 some_process)가 서버에서 실행되고 있는지 확인하려고 합니다. 그렇다면 echo 1, 그렇지 않으면 echo 0.

이것은 내가 사용하는 명령이지만 부분적으로 만 작동합니다 (아래 자세한 정보 참조). 스크립트를 한 줄에 작성해야합니다.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

참고 :[s] 에이 some_proces[s]방지하는 것 grep자체를 반환에서.

some_process실행 중이 면 "1"반향이 발생합니다. 그러나 some_process실행 중이 아니면 아무 것도 에코되지 않습니다.


4
ps -Ccmd명령 이름이 "cmd"인 프로세스를 찾는 데 사용할 수 있습니다.이 프로세스를 완전히 제거 할 수 있습니다 grep. ps일치하는 프로세스를 찾지 못하면 종료 코드를 0이 아닌 값으로 설정합니다.
rici

답변:


273

명시 적으로 확인할 필요가 없습니다 $?. 그냥 해:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

이것은 에코 실패에 의존하므로 확실히 보장되지는 않습니다. 이것을 작성하는보다 안정적인 방법은 다음과 같습니다.

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi

9
하면 echo 1실패 후 echo 0실행됩니다. 이 경우 에코 1은 절대 실패하지 않지만 A && B || C는 if-then-else가 아닙니다. A가 true 일 때 C가 실행될 수 있습니다 ( shellcheck에서 ).
schemacs

@schemacs는보다 효과적인 대안을 제공하기 위해 편집 할 수있는 매우 타당한 점을 제시합니다.
William Pursell

2
ps 명령의 출력을 파일로 경로 재지 정해야합니까? 이 작동하지 않습니까? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. 로컬에서 그것은 나를 위해 일하는 것 같습니다. OP가 시도한 명령에 리디렉션이 있었기 때문입니까?

1
출력을 재 지정할 필요는 없습니다. 나는 출력이 이유 때문에 저장되고 있다고 가정하기 때문에 원래 위치를 유인합니다. 종종 이런 종류의 일은 단순히 억제되지 않습니다 ( grep -q/ dev / null 과 함께 또는 / dev / null로 리디렉션 됨).
William Pursell

사용 pgrep합니다.
pawciobiel

67

&&"그리고 성공하면"을 의미한다; if명령문을 오른쪽 에 배치 하면 grep리턴시 에만 실행되도록해야 합니다 0. 수정하려면 ;대신 사용하십시오.

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(또는 그냥 줄 바꿈을 사용하십시오).


6
+1 이것은 단지 대안을 제공하는 것이 아니라 실제로 질문에 대답하기 때문에 훨씬 더 나은 대답입니다.
윌리엄 퍼셀

41

사용 grep -vc무시 grepps출력과 동시에 라인을 계산합니다.

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi

15

다음 &&||같이 and 연산자를 최대한 활용할 수 있습니다 .

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

grep 자체를 제외하기 위해 다음과 같은 작업을 수행 할 수도 있습니다.

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.