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 的回答有效,但有人可以解释为什么上述两个不起作用吗?
您的命令无法按照您期望的方式工作,因为测试不会向其标准输出流输出任何内容。它是通过管道传输到管道中的下一个命令(您的第一个命令)的标准输出流,它是替换命令替换(您的第二个命令)的标准输出。
顺便说一句,请注意,即使您的第一个管道的左侧在其标准输出流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 test和man [(或help test在bash外壳中)。
最近执行的命令的退出状态存储在特殊变量中$?。
您可以将其保存在普通变量中,或将其输出到终端:
[ 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)
请注意,测试本身永远不会在此处输出任何内容。它只提供退出状态。