답변:
이 줄로 :
command1 && command2
command2는 command1이 종료 상태를 0으로 반환하는 경우에만 실행되지만 다음 줄에서는 다음과 같이 실행됩니다.
command1 ; command2
command1과 command2는 모두 관계없이 실행됩니다. 세미콜론을 사용하면 한 줄에 많은 명령을 입력 할 수 있습니다.
당신은 자신을 위해 차이를 시도 할 수 있습니다 :
ls /invalid/path && echo "hello!"
/ invalid / path가 존재하지 않기 때문에 ls는 디렉토리 목록을 보여줄 수 없습니다. "ls : / invalid / path : No such file or directory"오류 메시지와 함께 실패합니다. 하반기 명령이 ( "안녕하세요!"에코)이되고 도 실행되지 않습니다 상반기에 실패하기 때문이다.
ls /invalid/path ; echo "hello!"
이전과 동일한 오류 메시지가 나타나지만 이번에는 두 번째 부분이 실행됩니다 !
ls : / invalid / path : 그런 파일이나 디렉토리가 없습니다
hello!
이것이 왜 유용한가요?
archive.tar.gz라는 파일을 추출한다고 가정하면
명령을 사용할 수 있습니다 tar zxvf archive.tar.gz && rm archive.tar.gz.
어떤 이유로 든 아카이브 추출에 실패하면 두 번째 부분이 실행되지 않습니다! 다시 시도 할 수 있습니다.
사용하면; 같은 상황에서 보관 파일이 삭제되고 다시 시도 할 수 없습니다.
&&is AND, 즉 두 번째 명령은 첫 번째 명령이 true를 반환 한 경우에만 실행됩니다 (오류 없음).
AND 첫 번째가 동일한 경우 실행 두 번째 매개 변수는 무관하게 false등 기본 코드는 첫 번째가 무엇인지 알고까지 2 매개 변수의 평가를 연기하기 위해 최적화됩니다.
&&이진 연산자, 함수입니다. 유일한 "특별한 것"은 그것이 어쨌든 이러한 표기법의 대부분의 연산자 인 표준 표기법이고 두 번째 피연산자의 실행이 지연된다는 것입니다. 지연된 실행은 실제로이 문맥에서 개념적으로 if진술 로 볼 수있는 것으로 사용될 수있는 능력을 제공 하지만, 원래 의도 된 용도가 실제 진술 의 조건 내에 있다는 사실에서 벗어나지 않습니다 if. 여기서 사용하는 것은 실제로 "해킹"에 가깝습니다.
a && b || c = (a && b) || c. 간단한 평가 순서. 거기에는 미스터리가 없습니다. 일반적인 함수처럼 작성하면 간단하게 보일 것 or(and(a, b), c)입니다. 이 논리는 내 동일 if하기 때문에 바로 명령 줄로를 입력 할 때뿐만 아니라 조건 &&및 ||있는 사업자 들은 피연산자 2 개를 사용하여 그들은 서로를 반환.
업데이트 : 가능한 트랩을 높이기 위해 스크립트로 추가했습니다.
아무도 "||"에 대해 언급하지 않았으므로
Update2 : 여기에서 중요한 단어 다시 쓰기
&&는 "true"에 응답하는 "if"문의 "then"과 같습니다.
|| 되는 NOT 에 "만약"한 Statment ..의 "다른"좋아
||를 "false"에 응답하는 "if"문의 "then"과 같습니다.
더 구체적으로, && 테스트는 $? 가장 최근에 실행 된 이전 명령문 의 값을 리턴 하고 && 바로 다음의 명령문 또는 서브 쉘에 제어를 전달합니다. $? 사실이다.
|| 비슷하며 종종 && 문 다음에 표시되지만 가장 최근에 실행 된 이전 문 에서 잘못된 반환 값 ($?)을 테스트 합니다 ... NB! Nota Bene! 잘 결정하십시오! .... predecing 문이 true 일 것으로 예상 될 때 false를 다시 발생시키는 && 문이면 || 같은 라인에 둘을 혼합하면 위험 할 수 있습니다.
내가하려고하는 요점은 내가 저지른 실수와 관련이 있습니다. 즉 :
## [[조건]] && A || B는
되어 있지 는 C / C ++ 스타일의 원처럼 행동하지 않습니다. 즉 :
// (조건)? A : B
"A"의 "예기치 않은"결과의 예는 아래 스크립트를 참조하십시오.
기본 테스트와 && 및 || 성명서는 모두 같은 줄에 있어야합니다 ...
이 스크립트를 실행하여 && 및 ||를 사용할 때 문제가 발생할 수있는 위치를 확인하십시오. 가장 최근에 실행 된 문은 당신이 기대하는 하나가 될 수 없습니다 ..
[[조건]] && 에코 안녕하세요 || echo Goodbye ....
잘 구성된 에코가 true를 반환하기 때문에 일반적으로 안전 합니다.
그러나 종료되지 않는 파일에 액세스하는 것은 어떻습니까?
#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo ======
((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && echo " \$0 0 rc=$? ..&&.. condition is true" || echo " \$0 0 rc=$? ..||.. condition is false"
((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && echo " \$0 1 rc=$? ..&&.. condition is true" || echo " \$0 1 rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo ======
((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false"
$0 0 || echo " \$0 0 rc=$? ..||.. condition is true" && echo " \$0 0 rc=$? ..&&.. condition is false"
((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false"
$0 1 || echo " \$0 1 rc=$? ..||.. condition is true" && echo " \$0 1 rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false"
exit
이후의 명령 (스크립트의 경우 기능) &&은 첫 번째 명령의 RETVAL (스크립트의 경우 기능)에 따라 실행됩니다. 성공하면 첫 번째 명령이 0 값을 리턴하도록합니다. 반환 값을 확인하여 추가 명령을 실행할 수 있습니다.