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


当前回答

if [ -z "$(ls -lA)" ]; then
  echo "no files found"
else
  echo "There are files"
fi

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

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

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

其他回答

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

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

这是可行的

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

然而,

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

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

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

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

下面是另一种方法,将某些命令的std-out和std-err写入临时文件,然后检查该文件是否为空。这种方法的一个好处是它捕获两个输出,并且不使用子外壳或管道。后面这些方面很重要,因为它们会干扰捕获bash退出处理(例如这里)

tmpfile=$(mktemp)
some-command  &> "$tmpfile"
if [[ $? != 0 ]]; then
    echo "Command failed"
elif [[ -s "$tmpfile" ]]; then
    echo "Command generated output"
else
    echo "Command has no output"
fi
rm -f "$tmpfile"

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

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

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

到目前为止给出的所有答案都处理终止并输出非空字符串的命令。

大多数是在以下意义上被打破的:

它们不能正确地处理只输出换行符的命令; 从Bash≥4.4开始,如果命令输出null字节(因为他们使用命令替换),大多数将发送垃圾邮件标准错误; 大多数人将发出完整的输出流,所以会等到命令结束才回答。有些命令永远不会终止(例如,尝试,yes)。

所以为了解决所有这些问题,并有效地回答下面的问题,

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

你可以使用:

if read -n1 -d '' < <(command_here); then
    echo "Command outputs something"
else
    echo "Command doesn't output anything"
fi

您还可以使用read的-t选项添加一些超时,以测试命令是否在给定时间内输出非空字符串。例如,对于2.5秒的超时:

if read -t2.5 -n1 -d '' < <(command_here); then
    echo "Command outputs something"
else
    echo "Command doesn't output anything"
fi

的话。如果您认为需要确定命令是否输出非空字符串,那么您很可能遇到了XY问题。