파일이 존재하는지 테스트하기 위해 다음 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이 아니므로 test
true가 반환됩니다.
이 동작은 다음과 같이 정의됩니다.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
다른 방법도 있습니다:
이전에 변수를 확인하십시오(설명에 따라 버전 사용).
if [ -n "$MYAPPPATH" ] && [ -e "$MYAPPPATH" ] ; then ...
locate
대신 *를 사용하세요find
if locate -w "$APPDIR/myapp*" ; then ...
*1 사용할 때 locate
파일 데이터베이스를 업데이트하는 것을 잊지 마십시오updatedb