如何在 zsh if 语句中检查命令的结果是否有输出?

如何在 zsh if 语句中检查命令的结果是否有输出?

我想使用比较两个文件diff,然后如果它没有返回任何内容,echo "no diff"则显示差异。我当前的 if 语句仅在没有差异的情况下才有效,但如果有差异,则会给出“未找到”错误。

test.sh 如下所示:

#!/bin/zsh
if [$(diff file1 file2) = '']
then
    echo "no diff"
else
    diff file1 file2
fi

如果文件相同:

$ sh test.sh
no diff

如果文件不同:

$ cat file1
hello

$ cat file2
goodbye

$ sh test.sh
test.sh: 1: test.sh: [1,8c1,8: not found
< hello
---
> goodbye

在寻找解决方案的过程中,我发现使用空格if [ $(diffvsif [$(diff会有所不同,并且使用单个=vs==也有帮助。我想问题一定是我正在测试输出''(什么也没有)。它确实有效,但“未找到”行不属于那里。我不仅仅是想消除那条烦人的行,而是以正确的方式执行 if 语句,因为应该有一种方法可以获得我需要的结果,而不必运行两次diff

答案1

diff如果没有发现差异,则提供零退出状态,因此只需使用diff一次并根据需要输出消息:

if diff file1 file2; then
    echo 'no diff'
fi

  • diff实用程序可能有选项-s/ --report-identical-files(POSIX 规范的扩展)。这会将命令简化为:

    diff -s file1 file2
    
  • 错误的原因[1,8c1,8: not found是语法错误:[需要单独出现并带有有效的表达式和结束]参数。有关如何使用的信息test可以在 unix.stackexchange 上找到(关联 关联 关联) & 在手册页中man 1 test&man 1p test

  • 在 中test.sh,第一行是#!/bin/zsh,但随后脚本正在使用sh解释器运行(可能不是zsh)。如果您确实想使用zsh功能,那么您需要确保您实际上正在运行脚本zsh

相关内容