"[ -f file ] && command" 대신 "[ ! -f file ] || command"를 사용해야 하는 이유가 있나요?

"[ -f file ] && command" 대신 "[ ! -f file ] || command"를 사용해야 하는 이유가 있나요?

내가 찾은

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

Ubuntu 16.04 에서는 /etc/default/lxc교체되는 것 같습니다(내 코드 또는 패키지 관리자의 코드).

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

테스트는 반직관적이므로(파일이 존재하지 않아 테스트가 실패하면 명령을 실행) -version에 비해 장점이 있는지 궁금합니다 &&.

답변1

응, 신경쓰이면복합 문의 종료 코드. 다음을 시도해 보십시오:

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

true그런 다음 false및 인수를 사용하여 실행하십시오.

./script true
0
0

./script false
0
1

이 때문입니다단락 평가부울 표현식.

OP의 예에서 우리는파일이 존재하지 않습니다:

  • 첫 번째 경우, 첫 번째 조건은 두 번째 연산( TRUE OR x = TRUE)을 평가하지 않고 TRUE를 반환합니다. 복합문의 결과는 TRUE입니다.
  • 두 번째 경우에는 첫 번째 조건이 두 번째 연산( FALSE AND x = FALSE)을 평가하지 않고 FALSE를 반환합니다. 복합문의 결과는 FALSE입니다.

종료 코드는 매우 중요합니다. 확인하다bash 스크립트에서 set -e는 무엇을 의미합니까?set -e, trap및 의 가능한 의미를 확인하세요 set -o pipefail.

답변2

[ -f file ]file존재하는 경우 true그리고입니다 plain file.

[ ! -f file ]file존재하지 않으면 참또는다른 파일 형식입니다.

따라서 가독성 외에는 실질적인 차이가 없습니다.

관련 정보