![测试命令的输出是否为空字符串,如果不为空则打印其结果](https://linux22.com/image/192617/%E6%B5%8B%E8%AF%95%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E4%B8%BA%E7%A9%BA%E5%88%99%E6%89%93%E5%8D%B0%E5%85%B6%E7%BB%93%E6%9E%9C.png)
我正在使用来自的解决方案测试命令是否输出空字符串。除了这些解决方案之外,我想打印命令的输出(如果它不为空)。
我想知道如果命令的输出不为空,是否可以通过仅调用命令一次来打印命令的输出。
我可以通过在 中重新调用相同的命令来完成此操作if condition
,但现在第二次调用可能会消耗额外的 CPU 使用率,因为我们已经获得了其结果。
可能的方法是,同一命令被调用两次:
if [[ $(ls -A) ]]; then
ls -A
else
echo "no files found"
fi
output=$(git diff --ignore-blank-lines --color-words HEAD | tr -d ' \n\r\t ' | wc -c)
if [ "$output" -gt 0 ]; then
git diff --ignore-blank-lines --color-words HEAD
else
echo "diff is empty"
fi
答案1
笔记:该问题最初被标记为巴什,但 OP 此后表示使用的 shell 是zsh
.这会使答案在一定程度上无效。
您可以将命令的输出存储在变量中并测试该变量是否为空:
output="$(your_command)"
if [[ -n $output ]]
then
printf -- "%s\n" "$output"
else
printf -- "No output\n"
fi
该-n
测试将检查是否$output
为非空字符串。如果是,$output
则打印 的内容。否则,将打印一条消息,表明未产生任何输出。注意周围的引号"$output"
是必要的。
另请注意(正如 @ilkkachu 所提到的),尾随换行符将通过命令替换删除,因此如果您关心这些,则需要采用不同的方法。
答案2
如果您在任何情况下都需要输出,可以将其通过管道传输tee
并使用它来复制输出,而无需再次运行命令:一次到标准输出,一次到可以对空输入起作用的命令。
例如:
ls | tee >([ $(wc -m) -gt 0 ] || echo No output)
请注意,这仅处理标准输出,因此您可能会在错误消息后得到“无输出”。当命令的输出根据是否发送到终端而变化时,您还必须相应地调整命令(例如 ls -C
,或带颜色输出)。
答案3
以ls -A
命令为例,将执行以下操作:
if ls -A | grep ^; then
: the output was already written
else
: no output
fi
if ! ls -A | grep ^; then
: handle the no-output condition
fi
这也将确保在输出中保留尾随换行符。
对于本文提到的实际案例评论(不要less
以空输出运行),有-F
(“如果一个屏幕则退出”)选项:
command ... | less -FXR
(您可以省略X
较新版本的less
)。