wake-up-neo.com

&&와 ||의 혼동 연산자

나는 /etc/rc.d/init.d/sendmail 파일 (이것은 거의 사용되지 않았지만 시험을 위해 공부하고 있음을 알고 있음), && 그리고 || 연산자. 나는 다음과 같은 문장에서 사용될 수있는 곳을 읽었습니다.

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

이들은 &&|| 연산자는 테스트를 기반으로 응답을 유도하지만 이러한 연산자의 특정 사용에 관한 문서를 파헤칠 수는 없었습니다. 이 특정 상황에서 이들이 무엇을하는지 설명 할 수 있습니까?

105
josh-cain

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

[ ... ]를 리턴 값이있는 프로그램으로 간주 할 수 있습니다. 내부 테스트가 true로 평가되면 0을 리턴합니다. 그렇지 않으면 0이 아닌 값을 반환합니다.

예 :

$ false && echo howdy!

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

$ false || echo howdy!
howdy!

추가 메모 :

which [를 수행하면 [가 실제로 프로그램을 가리키는 것을 볼 수 있습니다! 그러나 일반적으로 스크립트에서 실행되는 것은 아닙니다. 실제로 실행되는 것을 보려면 type [를 실행하십시오. 프로그램 사용을 원한다면 /bin/[ 1 = 1와 같이 전체 경로를 지정하십시오.

159
Shawn J. Goff

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

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

@ Shawn-j-Goff의 답변을 위에서 확장하려면 &&는 논리 AND이며 ||는 논리 OR입니다.

Advanced Bash 스크립팅 안내서의 this 부분을 참조하십시오. 사용자 참조 링크의 일부 내용은 다음과 같습니다.

&& AND

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.

|| OR

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.
30
Tim Kennedy

내 경험으로는 && 및 || if 문을 한 줄로 줄입니다.

/root/Sample.txt라는 파일을 찾고 있다고 가정하면 일반적인 반복은 셸에서 다음과 같습니다.

if [ -f /root/Sample.txt ]
then
    echo "file found"
else
    echo "file not found"
fi

이 6 개의 줄을 한 줄로 줄일 수 있습니다.

[[ -f /root/Sample.txt ]] && echo "file found" || echo "file not found"

변수를 설정하거나 파일 등을 만들기 위해 몇 가지 반복을 실행할 때 수명이 더 쉽고 스크립트가 한 줄 if 함수를 사용하여 더 매끄럽게 보이지만 단점은 단일 반복에서 여러 명령을 구현하는 것이 조금 더 어려워진다는 것입니다 기능을 사용할 수 있습니다.

13
syme89

"짧은 절단"이라는 개념이 있습니다.

(expr1 && expr2)가 평가되는 경우-expr2가 "true"로 평가되는 경우에만 exp1가 평가됩니다. expr1가 true가 되려면 expr2(expr1 && expr2)가 모두 true이기 때문입니다. expr1가 "false"로 평가되면 expr2가 이미 "flase"이므로 (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

|| (또는)의 경우와 유사하지만 짧은 절단이 취소됩니다.

4
Larry