나는 다음 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 설명서에도 링크되어 있습니다.오류 번호그리고오류 번호.
답변2
당신이 사용할 때:
if [ $(tmux has -t junk) ]
이는 명령의 출력을 확인 tmux has -t junk
하지만 반환 값은 확인하지 않습니다.
따라서 항상 첫 번째 경우와 같은 것을 인쇄하므로 이는 tmux has -t junk
명령이 표준 출력에 아무것도 인쇄하지 않음을 의미합니다.
그래서 첫 번째 경우에는,
if [ $(tmux has -t junk) ]
으로 평가되었다
if [ ]