결과를 반환하기 위해 특정 값을 기반으로 두 파일의 내용을 확인하는 다음 코드 조각이 있습니다.
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=102
or 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
파일에서 읽은 내용이 실제로 숫자인지 확인하지 않습니다. 그렇지 않으면 두 산술 테스트 모두에서 "예상 정수 표현식" 오류가 발생하고 실패하게 됩니다.
관련된: