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


当前回答

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

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

这是可行的

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

然而,

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

其他回答

正如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 [ -z "$(ls -lA)" ]; then
  echo "no files found"
else
  echo "There are files"
fi

这将运行命令并检查返回的输出(字符串)的长度是否为零。 你可能想要检查“测试”手册页的其他标志。

在要检查的参数周围使用"",否则空结果将导致语法错误,因为没有给出第二个参数(要检查)!

注意:ls -la总是返回。和. .因此,使用这将不工作,请参阅ls手册页。此外,虽然这可能看起来方便和容易,我想它会很容易坏。编写一个根据结果返回0或1的小脚本/应用程序要可靠得多!

有时“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

正如Jon Lin所评论的,ls -al将始终输出(for。和. .)。您希望ls -Al避免这两个目录。

例如,你可以把命令的输出放到一个shell变量中:

v=$(ls -Al)

较旧的、非嵌套的符号是

v=`ls -Al`

但我更喜欢嵌套符号$(…)

您可以测试该变量是否为非空

if [ -n "$v" ]; then
    echo there are files
else
    echo no files
fi

你可以把两者结合起来,就像[-n "$(ls -Al)"];然后

有时,ls可能是某个shell别名。您可能更喜欢使用$(/bin/ls -Al)。参见ls(1)和hier(7)和environ(7)和你的~/。bashrc(如果你的shell是GNU bash;我的交互式shell是zsh,定义在/etc/passwd -见passwd(5)和chsh(1))。

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

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

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