bash if 문 동작 질문

bash if 문 동작 질문

나는 다음 bash 스크립트를 작성했습니다.

if [ $(tmux has -t junk) ]
then
echo zero
else
echo one
fi

세션이 존재하는지 여부에 관계없이 항상 하나를 반환합니다. tmux 문을 실행한 다음 $?를 실행하여 명령줄에서 확인했습니다. . 예상대로 작동합니다. 세션이 존재하면 0이고 세션이 존재하지 않으면 1입니다. if 문이 동일한 방식으로 작동하지 않는 이유는 무엇입니까? 아래와 같이 if 문을 변경해 보았습니다.

tmux has -t junk
if [ $? -eq 0 ]
then
echo zero
else
echo one
fi

위의 내용이 작동합니다. 그렇다면 첫 번째 명령문 블록에 무슨 문제가 있는 걸까요?

답변1

언급한 대로 if [ $(tmux has -t junk) ]확장하면 if [ ]false로 평가됩니다.

다음을 사용할 수 있습니다.

if tmux has -t junk; then
    echo OK
else
    echo ERR
fi

또는 더 짧은 내용을 원하는 경우:

tmux has -t junk || echo ERR

또는

tmux has -t junk && echo OK || echo ERR

다음과 같이 더 적합한 경우 이를 부정할 수도 있습니다.

! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.

편집하다:

또한 명령이 출력을 생성하는 경우 다음과 같이 해당 출력을 블랙홀로 리디렉션할 수도 있습니다 /dev/null.

 if my_cmd >/dev/null; then echo OK else; echo ERR; fi

명령에서 텍스트 오류가 발생하면 다음을 통해 표준 오류도 리디렉션할 수 있습니다.

 if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi

다음 내용은 이미 잘 알고 있을 수도 있지만 좀 더 완전성을 위해 추가합니다.

언급한 대로: $?프로그램의 반환 값을 얻는 유일한 방법입니다.

일부 프로그램은 반환 값이 다양하며 다소 명시적인 의미를 가질 수 있습니다.

예를 들면:

mycmd
ecode=$?

case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;
esac

이를 통해 특정 오류에 대해 적절한 조치를 취할 수 있습니다.

MySQL이 설치되어 있다면 다음과 같이 할 수 있습니다.테러:

for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done

그것에 대한 느낌을 얻으려면.

또한보십시오이 답변Open Groups 문서에도 연결되는 OS 특정 오류와 관련됨오류 번호그리고오류 번호.h.

아니면 좀 보세요SQLite그리고 그것의확장된 것.

답변2

당신이 사용할 때:

if [ $(tmux has -t junk) ]

이는 명령의 출력을 확인 tmux has -t junk하지만 반환 값은 확인하지 않습니다.

따라서 첫 번째 경우처럼 항상 인쇄하므로 이는 tmux has -t junk명령이 표준 출력에 아무 것도 인쇄하지 않는다는 것을 의미합니다.

그래서 첫 번째 경우에는,

if [ $(tmux has -t junk) ] 

으로 평가받고 있다

if [ ]

관련 정보