bash if 문 동작 문제

bash if 문 동작 문제

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

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

세션 존재 여부에 관계없이 항상 1을 반환합니다. 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 설명서에도 링크되어 있습니다.오류 번호그리고오류 번호.

아니면 좀 보세요SQLite그리고 그것의퍼지는.

답변2

당신이 사용할 때:

if [ $(tmux has -t junk) ]

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

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

그래서 첫 번째 경우에는,

if [ $(tmux has -t junk) ] 

으로 평가되었다

if [ ]

관련 정보