我有以下代码段,它根据某些值检查两个文件的内容以返回结果。
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=102
或sec=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
不检查从文件中读取的内容是否实际上是数字。如果不是,您将在两个算术测试中收到“预期的整数表达式”错误,并且它们将失败。
有关的: