-a 대 -e 옵션 인 경우 bash
Bash 문서의 about -a
및 -e
옵션 은 다음 과 같습니다.
-a file
True if file exists.
-e file
True if file exists.
차이점을 얻으려고 다음 스크립트를 실행했습니다.
resin_dir=/Test/Resin_wheleph/Results
if [ -e ${resin_dir} ] ; then
echo "-e ";
fi
if [ ! -e ${resin_dir} ] ; then
echo "! -e";
fi
if [ -a ${resin_dir} ] ; then
echo "-a";
fi
if [ ! -a ${resin_dir} ] ; then
echo "! -a";
fi
/Test/Resin_wheleph/Results
존재하고 디렉토리입니다. 그리고 이것은 내가 얻는 것입니다.
-e
-a
! -a
약간 이상하게 보입니다 (알림 -a
및 ! -a
). 그러나 if [[ -e ${resin_dir} ]]
비슷한 스크립트에서 이중 대괄호 (예 :)를 사용 하면 합리적인 결과를 얻을 수 있습니다.
-e
-a
그래서:
-a
및-e
옵션 의 차이점은 무엇입니까 ?-a
단일 대괄호 안에 사용할 때 왜 이상한 결과가 발생합니까?
나는 조사했고 이것은 꽤 털이 많다.
-a
는 더 이상 사용되지 않으므로 /usr/bin/test
더 이상 맨 페이지에 나열되지 않지만 여전히 bash에 대한 것입니다. 사용 -e
. 단일 '['의 경우 bash 내장은 and와 test
동일하게 작동하는 bash 내장 /usr/bin/[
과 동일하게 작동합니다 /usr/bin/test
(하나는 다른 하나에 대한 심볼릭 링크 임). 의 효과는 -a
위치 에 따라 다릅니다 file exists
. 시작에 있으면을 의미 합니다. 두 표현식의 중간에 있으면 논리적을 의미 and
합니다.
[ ! -a /path ] && echo exists
bash 매뉴얼에서 그것이 -a
이진 연산자로 간주되므로 위의 내용은 a로 파싱되지 않고 (비어 있지 않은) negate -a ..
것으로 파싱되므로 작동하지 않습니다 if '!' and '/path' is true
. 따라서 스크립트는 항상 출력 "-a"
(실제로 파일을 테스트 함)하고 "! -a"
실제로 and
여기 에서는 바이너리 입니다.
를 들어 [[
, -a
바이너리로 사용되지 않습니다 and
더 이상 ( &&
그것의 유일한 목적은 파일을 확인하는 것입니다, 그래서이 사용된다)가 (사용되지 않지만). 그래서 부정은 실제로 당신이 기대하는 것을합니다.
-a
테스트 연산자에 대한 ' '옵션은 단항 연산자와 이항 연산자라는 의미를 갖습니다. 이항 연산자로서 'and'연결 (그리고 ' -o
'는 'or'연결)입니다. 단항 연산자로서 분명히 파일의 존재를 테스트합니다.
autoconf
시스템은 '사용하지 않는 것이 당신을 조언 -a
이 혼란을 야기하기 때문에'; 이제 이유를 알 수 있습니다. 실제로 포터블 셸 프로그래밍에서는 조건을 ' &&
'또는 ' ||
' 와 결합하는 것이 가장 좋습니다 .
@litb가 올바른 방향이라고 생각합니다. ' ! -a ${resin_dir}
'가 있으면 Bash는이를 "is the string '!'으로 해석 할 수 있습니다. 비어 있지 않고 '$ {resin_dir}'의 문자열이며 비어 있지 않으며 대답은 yes입니다 .Korn 쉘은 이것에 대해 다른 견해를 가지고 있으며 Bourne 쉘은 또 다른 견해를 가지고 있으므로 ' -a
' 에서 멀리 떨어져 있습니다 .
Solaris 10의 경우 :
$ bash -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
Bad
$ ksh -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
OK
$ sh -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
sh: test: argument expected
$
이중 대괄호 [[exp]]는 bash 내장입니다. bash에서 -a와 -e는 아마도 이전 버전과의 호환성을 위해 동일합니다.
단일 대괄호 [exp]는 외부 명령 "test"의 별칭입니다. "test"에서 -a는 논리적 AND입니다. [nothing AND $ STRING]은 (는) 거짓이어야하는 것처럼 보이지만 test에는 몇 가지 구문 문제가 있습니다. 그래서 더 제정신이되는 경향이있는 bash 내장 [[exp]]를 사용하는 것이 좋습니다.
Note: bash really does call /bin/[ when you use "[".
$ [ $UNASIGNED_VAR == "bar" ]
bash: [: ==: unary operator expected
the error shows bash called [. An strace also shows "execve("/usr/bin/[", ..."
ReferenceURL : https://stackoverflow.com/questions/321348/bash-if-a-vs-e-option
'programing' 카테고리의 다른 글
함수 포인터 유형 반환 (0) | 2021.01.15 |
---|---|
IACA 란 무엇이며 어떻게 사용합니까? (0) | 2021.01.15 |
자바 스레드 재사용 (0) | 2021.01.15 |
빌더 패턴 및 다수의 필수 매개 변수 (0) | 2021.01.15 |
이 C ++ 11 정규식 오류 나 또는 컴파일러입니까? (0) | 2021.01.15 |