혼란스럽지만 여전히 Bash를 오해하고 있는 것 같습니다.
/$ if [ -e /bin/grep ]; then echo yea; else echo nay ; fi
yea
/$ if [ ! -e /bin/grep ]; then echo yea; else echo nay ; fi
nay
/$ if [ -a /bin/grep ]; then echo yea; else echo nay ; fi
yea
/$ if [ ! -a /bin/grep ]; then echo yea; else echo nay ; fi
yea
부정은 왜 !
테스트의 효과를 반전시키지만 테스트의 효과는 반전시키지 -e
않습니까 ?-a
맨 배쉬는 이렇게 말했습니다.
시험:
3개의 매개변수
다음 조건은 나열된 순서대로 적용됩니다.
- 두 번째 인수가 위의 조건식에 나열된 이진 조건부 연산자 중 하나인 경우 표현식의 결과는 첫 번째 및 세 번째 인수를 피연산자로 사용하는 이진 테스트의 결과입니다. 인수 가 세 개인 경우
-a
and 연산자는 이항 연산자로 처리됩니다.-o
- 첫 번째 인수가 이면
!
값은 두 번째 및 세 번째 인수를 사용하는 2개 매개변수 테스트의 부정입니다.
Bash 조건식
[[
조건식은 복합 명령 및test
내장[
명령 에서 사용됩니다.
-a file
파일이 존재하면 참입니다.
-b file
파일이 존재하고 블록 특수 파일이면 참입니다.
-c file
파일이 존재하고 문자 특수 파일인 경우 True입니다.
-d file
파일이 존재하고 디렉토리이면 참입니다.
-e file
파일이 존재하면 참입니다.
답변1
-a
단항 연산자( a
접근성을 위해 Korn 셸과의 호환성을 위해 추가되었지만 그렇지 않으면 비표준이며 현재 중복됨 -e
)와 이항 연산자( a
POSIX에서(XSI 사용) nd의 경우 더 이상 사용되지 않음) 연산자입니다.
여기로 [ ! -a /bin/grep ]
전화함바이너리POSIX에 필요한 연산자입니다. 비어 있지 않은지 [ "$a" -a "$b" ]
테스트하는 것입니다 .$a
그리고 $b
$a
비어 있지 않습니다. 여기에 == !
및 $b
== 가 있습니다 /bin/grep
. 두 문자열 모두 비어 있지 않으므로 반환진짜.
또한보십시오"세 개의 인수가 있는 경우 -a 및 -o 연산자는 이항 연산자로 처리됩니다."당신이 인용한 본문에서요.
-a
단항 형식과 이진 형식은 모두 더 이상 사용되지 않으며, 단항 형식은 대체되므로 -e
, 이진 형식은 신뢰할 수 없고 모호한 테스트 표현식을 생성하므로 더 이상 사용되지 않습니다.
파일이 존재하는지 테스트합니다. (실제로는 파일이 존재하는지 테스트하는 것이 더 중요합니다.)접근성, stat()
경로에서 성공할까요? 1), [ -e filepath ]
.to를 사용하세요.그리고&&
통화 사이에 사용되는 두 가지 조건 [
.
문자열이 비어 있지 않은지 테스트하려면 개인적으로 형식 [ -n "$string" ]
보다 [ "$string" ]
형식을 선호합니다.
그래서:
파일이 존재하는지 테스트합니다.
[ -e "$file" ] # not [ -a "$file" ] [ ! -e "$file" ] # not [ ! -a "$file" ]
두 문자열이 비어 있지 않은지 테스트합니다.
[ -n "$a" ] && [ -n "$b" ] # not [ "$a" -a "$b" ] [ "$a" ] && [ "$b" ]
~에서POSIX 사양 의 유틸리티 기본 사항 test
(일명 )[
:
-a 및 -o 기본 바이너리와 "(" 및 ")" 연산자를 지정하는 XSI 확장은 더 이상 사용되지 않는 것으로 표시되었습니다. (이를 사용하는 많은 표현식은 평가되는 특정 표현식에 따라 구문에 의해 모호하게 정의됩니다.) 이러한 표현식을 사용하는 스크립트는 아래 주어진 형식으로 변환되어야 합니다. 많은 구현이 이러한 구식 형식을 계속 지원하지만 스크립트는 사용자 제공 입력을 처리할 때 매우 주의해야 합니다. 이 입력은 이러한 기본 형식 및 연산자와 혼동될 수 있기 때문입니다.
그리고:
초기 제안에서는 KornShell -a 기본 연산자(동일한 의미를 가짐)를 사용했지만 사람들이 -a 기본 연산자와 -a 이진 연산자를 혼동할 수 있다는 우려 때문에 나중에 -e로 변경했습니다.
yash
, bosh
, GNU 매뉴얼은 coreutils
각각의 구현에서 바이너리/의 사용을 방지하고 -a
매뉴얼은 이를 문서화하지 않습니다². 하지만 불행하게도 (GNU 쉘)을 포함한 다른 많은 매뉴얼은 여전히 바이너리/의 사용을 금지하지 않으며 이에 반대하지도 않습니다.-o
[
test
zsh
bash
1 자세한 내용은 다음을 참조하세요.이것은 관련 stackoverflow Q&A에 대한 나의 답변입니다.
² a test
/ [
내장 기능은 1991년 버전 2.0.3에서만 zsh에 추가되었습니다. [[ ... ]]
Korn 쉘의 특수 구성은 항상 선호되며 다음과 같은 용도로 &&
사용 ||
되는 고유한 구문을 갖습니다.그리고그리고또는운영자.
답변2
Bash는 비어 있지 않으면 true로 평가되는 두 개의 단일 단어 테스트로 둘러싸인 "and"를 의미하는 이항 연산자 [ ! -a WORD ]
로 구문 분석합니다. -a
따라서 [ ! -a "" ]
false이거나 null이 아닌 경우 true입니다 [ ! -a WORD ]
.WORD
이 분석은 다음과 일치합니다.POSIX 사양(엄밀히 말하면 POSIX는 단항을 지정하지 않기 때문에 이를 수행할 필요는 없습니다 -a
.) BTW, mksh 및 zsh는 이 경우를 동일한 방식으로 구문 분석하지만 ksh93은 단항을 사용 !
하여 구문 분석합니다 -a
.
모호함을 피하기 위해 더 이상 사용되지 않는 연산자를 사용하지 말고 이항 연산자와 철자가 동일하지 않은 -a
표준 연산자를 사용하십시오 . -e
또한 긴 특수 사례에서 모호함이나 오류를 방지하려면 잠재적으로 모호한 / inside 대신 이진 연산자(external 또는 Internal )로 &&
및 를 사용하세요 .||
[ … ]
[[ … ]]
-a
-o
[ … ]