& & 및 ||의 혼동 사용 연산자

/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 

&&|| 연산자를 사용하여 다음을 기반으로 응답을 유도하는 것 같습니다. 그러나 나는 이러한 연산자의 특정 사용에 관한 문서를 파헤칠 수 없었다. 누구든지이 특정 상황에서 이것이 무엇을하는지 설명 할 수 있습니까?

답변

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

는 반환 값이있는 프로그램입니다. 내부 테스트가 참으로 평가되면 0을 반환합니다. 그렇지 않으면 0이 아닌 값을 반환합니다.

예 :

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

추가 참고 사항 :

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

댓글

  • " X 또는 Y "는 X를 테스트합니다. 이것이 사실이면 ' " X 또는 Y " (' 참)이므로 Y를 테스트 할 필요가 없습니다. ' 사실, 당신은 ' " X 또는 Y "이므로 Y를 테스트해야합니다. " X 및 Y "가 표시되는 경우 , X를 테스트합니다. ' 거짓이면 " X 및 Y ('는 false), s o Y를 테스트 할 필요가 없습니다. X가 참이면 Y를 테스트하여 " X 및 Y "가 true.
  • " 왼쪽이 0을 반환하면 " 대신 " 왼쪽 명령 '의 종료 상태가 0 인 경우 ". " return "이 출력과 종료 상태가 모두 " 반환 값 "
  • 당신뿐만 아니라 " 고려 [ ... ] 프로그램이되기 위해서는 ", 대부분의 경우 입니다. 일반적으로 ' 파일은 /bin/[ 또는 /usr/bin/[에 있습니다.
  • C 프로그래머는 이것이 매우 혼란 스러울 것입니다. 0은 거짓을 의미합니다 … 쉘 스크립팅에서 0은 참을 의미합니다 … 정신이 나갔습니다.
  • @Calmarius ' C에 익숙하다면 return 상태, 부울이 아님. 여기서 return 0는 성공을 의미합니다.

답변

내 치트 시트 :

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

댓글

  • ' JavaScript 작업에서 시연되는 흥미로운 람다 미적분 유사점 (순서대로 변수 정의); " 왼쪽 (일명 true) " : (a => b => a). " 오른쪽 (일명 false) " : (a => b => b). " A; B " " 그런 다음 " (a => b => (() => b())(a())). " A & & B " " If else (when) " (a => b => a()(() => right)(b))." A || B " " else없이 if (unless) " (a => b => a()(b)(() => right)). " a & & b || c " " ifThenElse " (a => b => c => (unless(when(a)(b))(c))()) .
  • bash에서 왼쪽은 0 / 빈 문자열과 비슷하고 오른쪽은 다른 모든 것입니다.
  • 하나의 수직 막대는 어떻습니까?

답변

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

this 부분을 참조하십시오. 고급 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. 

답변

내 경험상 & & d || 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" 

몇 번 반복하여 변수를 설정하거나 파일 등을 생성하기 위해, 삶이 더 쉽고 스크립트는 단일 라인을 사용하여 더 매끄럽게 보입니다. 유일한 단점은 단일 반복에서 여러 명령을 구현하는 것이 조금 더 어려워 지지만 함수를 사용할 수 있다는 것입니다.

댓글

  • 멋지네요. objc 코드 (a == b)가 생각 나나요? val = 1 : val = 2;
  • " & ? ./someScript.sh & && echo 'ok' || echo 'ko'
  • 형식 : foo && bar || baz에 대한 구문 오류가 발생합니다. foo 인 경우 성공하면 bar가 실패하고 baz가 실행되므로 if 문.
  • {} 괄호 안에 && 또는 || (예 : pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; }). if..then..else가 true /보다 신뢰할 수있는 " 인식기 "라는 점도 언급 할 가치가 있습니다. &&||를 사용하는 것보다 잘못된 조건입니다.

답변

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

(expr1 && expr2)가 평가 될 때-expr2exp1가”true “로 평가되는 경우에만 평가됩니다. 이는 (expr1 && expr2)가 true가 되려면 expr1expr2가 모두 true 여야하기 때문입니다. expr1가 “false”로 평가되는 경우 expr2(expr1 && expr2) 때문에 evalued (바로 가기)가 아닙니다. 이미 “flase”입니다.

다음 시도-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

|| (또는)와 비슷하지만 짧습니다. 절단이 반전됩니다.

설명

  • 이 로직은 일반적으로 " 단락

. ' " 짧은 절단 " 문구를 본 적이 없습니다. 참고 문헌을 찾는 데 도움이되도록 언급합니다.

Answer

Shawn J. Goff의 답변 예제 정확하지만 설명은 반대입니다. 확인하십시오 :

& &의 오른쪽 왼쪽의 종료 상태가 NONZERO 인 경우에만 평가됩니다. || 반대 : 왼쪽 이탈 상태가 0 인 경우에만 오른쪽을 평가합니다.

댓글

  • 셸의 경우 0 종료 코드가 true 로 평가되어
    의 왼쪽에 0이 아닌 종료 코드가 있음을 알고 있습니다. id = “90ef570c64″>

    결과 전체 표현식이 false ?를 반환합니까?

  • 당신의 대답이 아니기 때문에 누군가가 당신의 편집을 승인하지 않았습니다.일부 답변이 틀렸다고 생각되면 반대 투표를하고 댓글을 남겨야합니다. 변경이 필요하다고 생각되면 댓글을 남겨주세요. 수정은 답의 의미를 변경하지 않는 문법, 서식 및 맞춤법 오류를 수정하기위한 것입니다.
  • @countermode I ' 죄송합니다. 맞습니다. 나는 리눅스에서 0 = 거짓이고 0이 아닌 = 참이라고 생각했다 (C와 다른 많은 언어 / 환경 / 플랫폼 에서처럼). 오해를 드려 죄송합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다