&& 및 || 연산자의 사용은 혼란스럽습니다.

&& 및 || 연산자의 사용은 혼란스럽습니다.

파일을 살펴보고 있는데 /etc/rc.d/init.d/sendmail(이것이 거의 사용되지 않는다는 것은 알지만 시험 공부를 하고 있는 중입니다) &&and 연산자에 대해 ||약간 혼란스럽 습니다. 나는 다음과 같은 진술에 사용될 수 있다는 것을 읽었습니다.

if [ test1 ] && [ test2 ]; then
     echo "both tests are true"
elif [ test1 ] || [ test2 ]; then
     echo "one test is true"
fi

그러나 이 스크립트는 다음과 같은 한 줄 문을 표시합니다.

[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE"
[ -f /usr/sbin/sendmail ] || exit 0

&&이는 테스트를 기반으로 응답을 도출하기 위해 및 연산자를 사용하는 것으로 보이지만 ||이러한 연산자의 특정 사용법에 대한 문서를 찾을 수는 없습니다. 이 특정한 경우에 그들이 무엇을 하는지 설명할 수 있는 사람이 있습니까?

답변1

&&오른쪽은 왼쪽의 종료 상태가 0(즉, true)인 경우에만 평가됩니다. ||반대로, 왼쪽의 종료 상태가 0이 아닌 경우(즉, false) 오른쪽만 평가합니다.

[ ... ]값을 반환하는 프로그램이라고 생각하시면 됩니다 . 내부 테스트 결과가 true이면 0을 반환하고, 그렇지 않으면 0이 아닌 값을 반환합니다.

예:

$ false && echo howdy!

$ true && echo howdy!
howdy!
$ true || echo howdy!

$ false || echo howdy!
howdy!

추가 지침:

이렇게 하면 프로그램을 가리킨다는 which [것을 알 수 있습니다 ! 그러나 일반적 으로 실제로 실행되는 내용을 확인하기 위해 [스크립트에서 실행되지 않습니다 . type [프로그램을 사용해 보려면 다음과 같이 전체 경로를 제공하면 됩니다 /bin/[ 1 = 1.

답변2

내 치트 시트는 다음과 같습니다.

  • "A ; B"는 A의 성공 여부에 관계없이 A를 실행한 다음 B를 실행합니다.
  • "A && B" A가 성공하면 B를 실행합니다.
  • "A || B" A가 실패하면 B를 실행합니다.
  • "A &"는 A를 백그라운드에서 실행합니다.

답변3

위의 @ Shawn-j-Goff의 답변을 확장하면 논리적 AND와 논리적 OR이 &&있습니다 .||

바라보다이것고급 Bash 스크립팅 가이드의 일부입니다. 링크에 포함된 내용 중 일부는 다음과 같이 사용자의 참고를 위한 것입니다.

&& 그리고

if [ $condition1 ] && [ $condition2 ]
#  Same as:  if [ $condition1 -a $condition2 ]
#  Returns true if both condition1 and condition2 hold true...

if [[ $condition1 && $condition2 ]]    # Also works.
#  Note that && operator not permitted inside brackets
#+ of [ ... ] construct.

||또는

if [ $condition1 ] || [ $condition2 ]
# Same as:  if [ $condition1 -o $condition2 ]
# Returns true if either condition1 or condition2 holds true...

if [[ $condition1 || $condition2 ]]    # Also works.
#  Note that || operator not permitted inside brackets
#+ of a [ ... ] construct.

답변4

"단축키"라는 개념이 있습니다.

평가 시기 (expr1 && expr2)- "true"로 평가되는 경우에만 평가합니다 expr2. AND가 모두 참이어야 참이 되기 exp1때문입니다 . "false"로 평가되면 이미 "flase"이므로 평가(단축키)되지 않습니다 .expr1expr2(expr1 && expr2)expr1expr2(expr1 && expr2)

다음을 시도해 보십시오. 파일은 F1존재하지만 파일은 F2존재하지 않는다고 가정합니다.

( [ -s F1 ] && echo "File Exists" )  # will print "File Exists" - no short cut
( [ -s F2 ] && echo "File Exists" )  # will NOT print "File Exists" - short cut

(or)와 유사 ||하지만 단락은 반대입니다.

관련 정보