如何测试命令是否输出空字符串?


当前回答

正如tripleee在问题评论中提到的,使用moreutils ifne(如果输入不为空)。

在这种情况下,我们想要ifne -n,它否定测试:

ls -A /tmp/empty | ifne -n command-to-run-if-empty-input

当初始命令的输出为非空时,此方法相对于许多其他答案的优点。ifne将立即开始将其写入STDOUT,而不是缓冲整个输出,然后再写入,如果初始输出生成缓慢或非常长,并且会溢出shell变量的最大长度,这是很重要的。

moreutils中有一些utils可以说应该放在coreutils中——如果你花大量时间生活在shell中,它们值得一试。

对OP特别感兴趣的可能是diempty /exists工具,在撰写本文时仍在考虑中,并且已经有一段时间了(它可能会使用bump)。

其他回答

下面是针对更极端情况的解决方案:

if [ `command | head -c1 | wc -c` -gt 0 ]; then ...; fi

这是可行的

所有伯恩炮弹; 如果显示信息全为0; 高效,无论输出大小;

然而,

一旦输出任何内容,命令或其子进程将被杀死。

有时您希望保存输出(如果它是非空的),以便将其传递给另一个命令。如果是的话,你可以使用

list=`grep -l "MY_DESIRED_STRING" *.log `
if [ $? -eq 0 ]
then
    /bin/rm $list
fi

这样,如果列表为空,rm命令就不会挂起。

有时“something”可能不是stdout,而是测试应用程序的stderr,所以这里有一个更通用的修复方法:

if [[ $(partprobe ${1} 2>&1 | wc -c) -ne 0 ]]; then
    echo "require fixing GPT parititioning"
else
    echo "no GPT fix necessary"
fi

适合那些想要优雅的、与bash版本无关的解决方案(实际上应该可以在其他现代shell中工作)以及喜欢使用一行程序执行快速任务的人。我们开始吧!

ls | grep . && echo 'files found' || echo 'files not found'

(注意,正如其中一个评论提到的,ls -al和事实上,只是-l和-a都会返回一些东西,所以在我的回答中,我使用简单的ls

正如tripleee在问题评论中提到的,使用moreutils ifne(如果输入不为空)。

在这种情况下,我们想要ifne -n,它否定测试:

ls -A /tmp/empty | ifne -n command-to-run-if-empty-input

当初始命令的输出为非空时,此方法相对于许多其他答案的优点。ifne将立即开始将其写入STDOUT,而不是缓冲整个输出,然后再写入,如果初始输出生成缓慢或非常长,并且会溢出shell变量的最大长度,这是很重要的。

moreutils中有一些utils可以说应该放在coreutils中——如果你花大量时间生活在shell中,它们值得一试。

对OP特别感兴趣的可能是diempty /exists工具,在撰写本文时仍在考虑中,并且已经有一段时间了(它可能会使用bump)。