빈 파일 테스트가 예상대로 실패하지 않음

빈 파일 테스트가 예상대로 실패하지 않음

결과를 반환하기 위해 특정 값을 기반으로 두 파일의 내용을 확인하는 다음 코드 조각이 있습니다.

if [[ "$(/bin/cat ${TMP_FILE})" != "" ]]
then
    if [[ $(cat ${TMP_FILE}) -gt ${TEST1} ]]
    then
        res=503
        sec=101
    elif [[ $(cat ${TMP_FILE2}) -gt ${TEST2} ]]
    then
        res=503
        sec=102
    else
        res=200
        sec=103
    fi
else
    res=503
    sec=999
fi

기본적으로 $TMP_FILE비어 있으면 바로 끝으로 점프합니다 sec=999.

$TMP_FILE2하지만 비어 있으면 끝까지 점프하는 결과도 얻습니다 . 무슨 일이야, 2부나 3부( sec=102or sec=103)에서 실패할 거라고 예상했으니까.

답변1

파일을 세 번 읽었습니다(!). 물론 운영 체제는 파일 캐싱을 제공하여 상황을 덜 나쁘게 만들 수 있습니다(최악의 경우: 읽기 사이에 파일이 변경되면 스크립트가 세 가지 다른 내용을 읽습니다). 파일 내용을 분기하지 않고 한 번 읽은 cat다음 해당 내용에 대해 쉘 테스트를 사용하는 것이 더 현명합니다.

#!/usr/bin/env bash

# look ma no cat!
TMP_FILE_CONTENTS=$(<"$1")

if [[ -n "$TMP_FILE_CONTENTS" ]]; then
    if [[ "$TMP_FILE_CONTENTS" -gt 42 ]]; then
        echo more
    else
        echo less
    fi
else
    echo empty
fi

나에게 이것은 다음과 같은 것을 생산할 것입니다

$ :> empty
$ echo 5 > small
$ echo 999999 > big
$ ./reed empty
empty
$ ./reed small
less
$ ./reed big  
more
$ 

답변2

연산자를 사용하여 -s파일이 비어 있지 않은지 확인하십시오. 를 사용할 필요가 없습니다 cat.

또한 elif두 번째 파일이 비어 있지 않은지 확인하고 성공하면 비교를 수행합니다.

if [ -s "${TMP_FILE}" ]
then
    if [ $(cat "${TMP_FILE}") -gt ${TEST1} ]
    then
        res=503
        sec=101
    elif [ -s "${TMP_FILE2}" ] && [ $(cat "${TMP_FILE2}") -gt ${TEST2} ]
    then
        res=503
        sec=102
    else
        res=200
        sec=103
    fi
else
    res=503
    sec=999
fi

답변3

파일을 여러 번 읽을 필요는 없습니다. 두 번째 파일을 사용할 수 없거나 비어 있을 때 어떤 로직을 구현하고 싶은지 잘 모르겠습니다. 하지만 다음은 파일에서 값을 읽고 빈 파일에 반응하는 방법을 보여주는 제안 사항입니다.

#!/bin/sh

if read number <file1; then
    if [ "$number" -gt "$test1" ]; then
        res=503
        sec=101
    else
        if read number <file2 && [ "$number" -gt "$test2" ]; then
            res=503
            sec=102
        else
            res=200
            sec=103
        fi
    fi
else
    res=503
    sec=999
fi

else첫 번째 파일이 존재하지 않거나 비어 있으면 이 스크립트는 마지막 분기로 이동합니다. 그렇지 않으면 첫 번째 테스트에서 파일에서 읽은 숫자를 사용합니다.

첫 번째 테스트가 실패하면 두 번째 파일을 읽고 두 번째 파일이 존재하지 않거나 비어 있거나 숫자가 더 크면 해당 else분기( res=200, )를 가져옵니다.sec=103$test2

파일에서 읽은 내용이 실제로 숫자인지 확인하지 않습니다. 그렇지 않으면 두 산술 테스트 모두에서 "예상 정수 표현식" 오류가 발생하고 실패하게 됩니다.

관련된:

관련 정보