단일 if 문에서 여러 조건을 연결할 때 오류가 발생했습니다.

단일 if 문에서 여러 조건을 연결할 때 오류가 발생했습니다.

쉘 스크립트를 작성 중인데 스크립트의 일부에서 파일이 존재하지 않는지 또는 제공된 파일 이름이 비어 있는지(즉, 파일 이름이 제공되지 않았는지) 확인해야 합니다.

이것은 내 코드입니다 -

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[bashfile_name='='

이것이 논리를 변경하지 않더라도 -z시스템에 대한 쿼리를 포함하지 않으므로 수표를 먼저 옮겼으므로 비용이 저렴합니다. stdout 대신 stderr로 오류 메시지를 보내 echo도록 첫 번째 메시지를 교체했습니다 .echo>&2

관련 정보