什么是“$?”准确地给我们一个shell脚本?

时间:2011-09-12 03:52:19

标签: linux bash shell sh

我看到代码写在网上的某个地方,我想知道究竟是什么“$?”做/给我们。 谷歌搜索没有帮助。

这是我在其中看到的代码:

#!/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

5 个答案:

答案 0 :(得分:35)

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

示例C程序(example.c):

int main() { return 1; }

示例Bash:

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

答案 1 :(得分:12)

大多数答案都缺少一些细节。在POSIX standard for the shell, in the section on special parameters

中找到了明确的答案
  

$?扩展到最近管道的十进制退出状态   (见管道)。

不要对 pipeline 这个词感到惊讶,因为即使像ls这样的简单命令在语法上也是由单个命令组成的管道。但是,对于多命令管道来说,$?是什么?它是管道中 last 命令的退出状态。

那么在后台执行的管道如grep foo bigfile|head -n 10 > result &

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

值得一提的另一个细节是退出状态通常在0到255的范围内,128到255表示由于信号而退出的过程。从{C}程序返回其他值可能无法在$?中准确反映。

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

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

 who; echo $?

输出将是

 user  tty7         2014-07-13 19:47
 0

显示的输出和命令的退出状态。一个脚本是一样的。

 #!/bin/bash
 who
 echo $?

输出:0

答案 4 :(得分:0)

其他答案很好地涵盖了bash,但你没有在你的问题中指定一个shell。在csh(和tcsh)中,$?可用于query the existence of variables,例如。

if $?my_var then
    echo my_var exists
endif