我如何回显 [ 4 -gt 3 ] 的值,这是 bash 中的测试表达式?

str*_*160 0 bash shell-script shell-builtin bash-functions

如何回显 [ 5 -gt 4 ] 的值,即 bash 中的测试表达式?

[ 5 -gt 4 ] | echo
Run Code Online (Sandbox Code Playgroud)

echo `[ 5 -gt 4 ]`
Run Code Online (Sandbox Code Playgroud)

两者最终都打印了一个空行

@Thomas Dickey 的回答有效,但有人可以解释为什么上述两个不起作用吗?

Kus*_*nda 5

您的命令无法按照您期望的方式工作,因为测试不会向其标准输出流输出任何内容。它是通过管道传输到管道中的下一个命令(您的第一个命令)的标准输出流,它是替换命令替换(您的第二个命令)的标准输出。

顺便说一句,请注意,即使您的第一个管道的左侧在其标准输出流echo上生成了某些内容,右侧也不会显示它。该echo实用程序不会从其标准输入读取(但例如读取cat)。


任何 shell 命令都会返回退出状态。该退出状态是例如if语句所作用的。退出状态永远不会输出到例如终端,否则会干扰命令或脚本的实际输出。

当你使用

[ 3 -gt 4 ]
Run Code Online (Sandbox Code Playgroud)

[使用一些参数调用该实用程序。该实用程序返回退出状态。它完全等同于

test 3 -gt 4
Run Code Online (Sandbox Code Playgroud)

请参阅man testman [(或help testbash外壳中)。

最近执行的命令的退出状态存储在特殊变量中$?

您可以将其保存在普通变量中,或将其输出到终端:

[ 3 -gt 4 ]
printf 'Exit status of test was %s\n' "$?"
printf 'Exit status of printf was %s\n' "$?"
Run Code Online (Sandbox Code Playgroud)

请注意,它printf 也会产生自己的退出状态,因此如果printf调用正常,则$?在输出测试状态后该值将为零。

上面的代码可能会输出

Exit status of test was 1
Exit status of printf was 0
Run Code Online (Sandbox Code Playgroud)

请注意,测试本身永远不会在此处输出任何内容。它只提供退出状态。