“$?”是什么让我们完全在一个shell脚本?

我看到代码写在网上,我想知道到底是什么“$?” 做/给我们。 谷歌search没有帮助。

这是我看到的代码:

#!/bin/sh ping -c 2 localhost if [ $? != 0 ] ; then echo "Couldn't ping localhost, weird" fi ping -c 2 veryweirdhostname.noend if [ $? != 0 ] ; then echo "Surprise, Couldn't ping a very weird hostname.." fi echo "The pid of this process is $$" 

采取: http : //efod.se/writings/linuxbook/html/shell-scripts.html

Solutions Collecting From Web of "“$?”是什么让我们完全在一个shell脚本?"

$? 是一个保存你运行的最后一个命令的返回值的变量。

示例C程序( example.c ):

 int main() { return 1; } 

示例Bash:

 gcc -o example example.c ./example echo $? # prints 1 

大部分的答案都缺少一些细节。 在shell的POSIX标准中找到了一个明确的答案,在特殊参数部分 :

$? 扩展到最近管道的小数退出状态(请参阅管道)。

不要对pipeline这个词感到惊讶,因为即使是一个简单的命令,比如ls在语法上也是一个由单个命令组成的管道。 但是,那么$? 为一个多命令管道? 这是管道中最后一个命令的退出状态。

而在后台执行的管道怎么样,像grep foo bigfile|head -n 10 > result &

一旦管道的最后一个命令完成,就可以通过wait来检索它们的退出状态。 后台进程的pid是可用的$!$? 只报告后台命令是否正确启动

另外值得一提的是,退出状态通常在0到255的范围内,128到255表示由于信号而退出的进程。 从C程序中返回其他值可能不会在$?准确反映出来$?

这是最近执行的命令的返回码。

按照惯例0是成功的退出,非0表示某种错误。

此特殊变量显示在脚本或命令行中运行的最后一个命令的退出状态。 例如,在命令行中,用户可以输入

  who; echo $? 

输出将是

  user tty7 2014-07-13 19:47 0 

这显示了的输出和命令的退出状态。 脚本将是相同的。

  #!/bin/bash who echo $? 

输出:0

其他的答案涵盖了很好,但你没有在你的问题中指定一个shell。 在csh(和tcsh) $? 可以用来查询变量的存在 ,例如

 if $?my_var then echo my_var exists endif