测试空白文件未按预期失败

测试空白文件未按预期失败

我有以下代码段,它根据某些值检查两个文件的内容以返回结果。

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为空,它也会跳到末尾。这是怎么回事,因为我预计它会在第二部分或第三部分(sec=102sec=103)中失败。

答案1

您读取该文件三次(!)——当然,操作系统可能提供了文件缓存,这使得情况不那么糟糕(最坏的情况:当文件在读取之间发生变化时,您的脚本会读取三个不同的内容)——但它可能更明智读取文件内容一次,无需分叉到cat,然后对这些内容使用 shell 测试。

#!/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

不检查从文件中读取的内容是否实际上是数字。如果不是,您将在两个算术测试中收到“预期的整数表达式”错误,并且它们将失败。

有关的:

相关内容