如何测试命令是否输出空字符串?
当前回答
适合那些想要优雅的、与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"
适合那些想要优雅的、与bash版本无关的解决方案(实际上应该可以在其他现代shell中工作)以及喜欢使用一行程序执行快速任务的人。我们开始吧!
ls | grep . && echo 'files found' || echo 'files not found'
(注意,正如其中一个评论提到的,ls -al和事实上,只是-l和-a都会返回一些东西,所以在我的回答中,我使用简单的ls
下面是针对更极端情况的解决方案:
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
有时“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