Bash 파일 존재 테스트는 항상 참입니다.

Bash 파일 존재 테스트는 항상 참입니다.

파일이 존재하는지 테스트하기 위해 다음 bash 스크립트 줄이 있습니다.

MYAPPPATH=$(find $APPDIR -iname myapp* -print)
if [ -e $MYAPPPATH ]
then
    echo "File exists" 
fi

그러나 "myapp"으로 시작하는 파일이 존재하지 않아 MYAPPPATH=''인 경우에는 위의 확인이 다시 성공합니다. 다음을 사용할 때 set -x파일이 존재하지 않으면 어떻게 되는지 확인하세요.

++ find /path/to/app -iname 'myapp*' -print
+ MYAPPPATH=
+ '[' -e ']'
+ echo 'File exists'

그 이유는 무엇입니까?

이 작업이 예상대로 작동하려면 어떻게 해야 합니까?

답변1

변수가 비어 있으면 명령은 다음과 같습니다.

[ -e ]

이 경우 [..]하나의 매개변수로 호출 할 수 있습니다 -e. 문자열 "-e"은 null이 아니므로 testtrue가 반환됩니다.

이 동작은 다음과 같이 정의됩니다.POSIX 테스트:

다음 목록에서 $1, $2, $3 및 $4는 테스트할 매개변수를 나타냅니다.

매개변수 0개:

거짓(1)을 종료합니다.

매개변수 1개:

$1이 null이 아니면 true(0)를 반환하고, 그렇지 않으면 false를 반환합니다.

....

작동하려면 다음을 수행해야 합니다.변수를 큰따옴표로 묶음:

[ -e "$MYAPPPATH" ]

-e이는 매개변수가 빈 문자열일 때 false이기 때문에 작동합니다 .

답변2

변수를 인용하는 데 익숙해지세요. 항상 인용하십시오. 이렇게 하면 필요할 때 잘못된 평가를 방지할 수 있습니다.

if [ -e "$MYAPPPATH" ]

bash 관련 복합 명령을 사용하면 이런 일이 발생하지 않습니다.

if [[ -e $MYAPPPATH ]]

답변3

다른 방법도 있습니다:

  1. 이전에 변수를 확인하십시오(설명에 따라 버전 사용).

    if [ -n "$MYAPPPATH" ] && [ -e "$MYAPPPATH" ] ; then ...
    
  2. locate대신 *를 사용하세요find

    if locate -w "$APPDIR/myapp*" ; then ...
    

*1 사용할 때 locate파일 데이터베이스를 업데이트하는 것을 잊지 마십시오updatedb

관련 정보