如何测试命令是否输出空字符串?
当前回答
有时您希望保存输出(如果它是非空的),以便将其传递给另一个命令。如果是的话,你可以使用
list=`grep -l "MY_DESIRED_STRING" *.log `
if [ $? -eq 0 ]
then
/bin/rm $list
fi
这样,如果列表为空,rm命令就不会挂起。
其他回答
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; 高效,无论输出大小;
然而,
一旦输出任何内容,命令或其子进程将被杀死。
我猜你想要ls -al命令的输出,所以在bash中,你会有这样的东西:
LS=`ls -la`
if [ -n "$LS" ]; then
echo "there are files"
else
echo "no files found"
fi
下面是另一种方法,将某些命令的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"
正如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)。