쉘 스크립트를 작성 중인데 스크립트의 일부에서 파일이 존재하지 않는지 또는 제공된 파일 이름이 비어 있는지(즉, 파일 이름이 제공되지 않았는지) 확인해야 합니다.
이것은 내 코드입니다 -
if ! [[ -e "$file_name" ] || [[ -z "$file_name" ]] ; then
echo "File doesn't exist"
exit 2
else
echo "ok"
fi
이 스크립트를 실행하면 이 코드 조각에서 구문 오류가 발생하거나 if 문 내에서 코드를 실행해야 할 때 else 코드가 실행됩니다.
내 코드에 몇 가지 구문 문제가 있다는 것을 알고 있습니다(논리도 좋지 않습니까?).
이에 대해 더 많이 조사하려고 노력했지만 필요한 모든 내용을 다루는 좋은 리소스를 찾을 수 없는 것 같습니다.
이에 대해 이미 많은 질문이 있지만 문제는 이러한 상황 중 하나에서 not 연산자를 어떻게 사용하는지 잘 모르겠다는 것입니다.
그렇다면 나는 무엇을 바꾸고 싶은가?
답변1
코드에 오타가 있습니다. 첫 번째 구성을 ]
꺼야 합니다 .]]
[[...]]
노력하다:
if [[ -z "$file_name" || ! -e "$file_name" ]]; then
echo>&2 "File doesn't exist"
exit 2
else
echo ok
fi
이것은 ksh 구문(현재 bash를 포함한 일부 다른 쉘에서 지원됨)입니다.
if [ -z "$file_name" ] || [ ! -e "$file_name" ]; then
echo>&2 "File doesn't exist"
exit 2
else
echo ok
fi
이것은 표준 sh
+ [
구문입니다.
Korn 쉘의 [
유틸리티 및 조건 구성은 해당 테스트 표현식에서 부정 연산자로 이해되지만 쉘 연산자를 사용할 수도 있습니다.[[...]]
!
!
if [ -z "$file_name" ] || ! [ -e "$file_name" ]; then
echo>&2 "File doesn't exist"
exit 2
else
echo ok
fi
이 [[...]]
구성에는 자체 ||
연산자도 있습니다. 그러나 호출 사이에 셸 연산자를 사용 ||
하거나 메서드에서와 같이 조건식 연산자 대신 셸 연산자를 사용할 수도 있습니다 .[[...]]
!
!
if [[ -z "$file_name" ]] || ! [[ -e "$file_name" ]]; then
echo>&2 "File doesn't exist"
exit 2
else
echo ok
fi
이 [
유틸리티에는 -o
또한또는그러나 이 연산자는 더 이상 사용되지 않으며 신뢰할 수 없는 테스트 표현식을 생성하므로 사용해서는 안 됩니다. 예를 들어 당시에는 셸의 내장 기능이 오류 로 인해 실패했습니다 .[ -z "$file_name" -o ! -e "$file_name" ]
too many arguments
[
bash
file_name='='
이것이 논리를 변경하지 않더라도 -z
시스템에 대한 쿼리를 포함하지 않으므로 수표를 먼저 옮겼으므로 비용이 저렴합니다. stdout 대신 stderr로 오류 메시지를 보내 echo
도록 첫 번째 메시지를 교체했습니다 .echo>&2