如何在同一个 if/then bash 脚本语句中检查字符串匹配和空文件?

如何在同一个 if/then bash 脚本语句中检查字符串匹配和空文件?

我正在编写一个简单的 bash 脚本来执行以下操作:

1)检查两个文件(foo1和foo2)。

2) 如果 foo1 与 foo2 不同,并且 foo1 不为空,则发送电子邮件。

3) 如果 foo1 与 foo2 相同... 或者 foo1 为空... 则不执行任何操作。

空白状态让我很困惑。下面是我要开始的内容:

diff --brief <(sort ./foo1) <(sort ./foo2) >/dev/null
comp_value=$?

if [ $comp_value -ne 0 ]
then
        mail -s "Alert" [email protected] <./alertfoo

fi

显然,这不会检查空白内容。有什么想法可以做到这一点吗?

答案1

您可以使用测试-s运算符来检查文件是否为空,这cmp通常是检查文件是否相等的最简单方法(请注意,您可以在语句中直接使用命令,if这是将其退出状态与 0 进行比较的更简单替代方法)。我保留了在比较两个文件之前对其进行排序的部分;如果不需要,只需直接将这两个文件用作 的参数即可cmp

if [ -s ./foo1 ] && ! cmp -q <(sort ./foo1) <(sort ./foo2); then
    ...

您可以将上述内容理解为:“如果 ./foo1 不为空 ( [ -s ... ]) 并且 ( &&) ./foo1 和 ./foo2 的排序形式不 ( !) 相同 ( cmp)”。

答案2

您可以使用 -s 来检查文件是否为空:

if [[ -s $FILE ]] ; then
echo "$FILE has data."
else
echo "$FILE is empty."
fi

如果想知道字符串是否为空,请使用选项 -z 来检查是否为空:

STRING="test"
if [[ -n "$STRING" ]]; then
    echo "String is not empty"
fi

或 -n 检查是否不为空:

STRING=""
if [[ -z "$STRING" ]]; then
    echo "String is empty"
fi

相关内容