如何测试命令是否输出空字符串?
当前回答
if [ -z "$(ls -lA)" ]; then
echo "no files found"
else
echo "There are files"
fi
这将运行命令并检查返回的输出(字符串)的长度是否为零。 你可能想要检查“测试”手册页的其他标志。
在要检查的参数周围使用"",否则空结果将导致语法错误,因为没有给出第二个参数(要检查)!
注意:ls -la总是返回。和. .因此,使用这将不工作,请参阅ls手册页。此外,虽然这可能看起来方便和容易,我想它会很容易坏。编写一个根据结果返回0或1的小脚本/应用程序要可靠得多!
其他回答
Bash参考手册
6.4 Bash条件表达式
-z string
True if the length of string is zero.
-n string
string
True if the length of string is non-zero.
你可以使用速记版:
if [[ $(ls -A) ]]; then
echo "there are files"
else
echo "no files found"
fi
if [ -z "$(ls -lA)" ]; then
echo "no files found"
else
echo "There are files"
fi
这将运行命令并检查返回的输出(字符串)的长度是否为零。 你可能想要检查“测试”手册页的其他标志。
在要检查的参数周围使用"",否则空结果将导致语法错误,因为没有给出第二个参数(要检查)!
注意:ls -la总是返回。和. .因此,使用这将不工作,请参阅ls手册页。此外,虽然这可能看起来方便和容易,我想它会很容易坏。编写一个根据结果返回0或1的小脚本/应用程序要可靠得多!
下面是另一种方法,将某些命令的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"
下面是针对更极端情况的解决方案:
if [ `command | head -c1 | wc -c` -gt 0 ]; then ...; fi
这是可行的
所有伯恩炮弹; 如果显示信息全为0; 高效,无论输出大小;
然而,
一旦输出任何内容,命令或其子进程将被杀死。
到目前为止给出的所有答案都处理终止并输出非空字符串的命令。
大多数是在以下意义上被打破的:
它们不能正确地处理只输出换行符的命令; 从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问题。