$的含义?在shell脚本中

时间:2011-08-30 18:33:47

标签: bash shell scripting special-characters

什么是

echo $?

在bash编程中意味着什么?

8 个答案:

答案 0 :(得分:151)

这是上次执行的命令的退出状态。

例如,命令true始终返回0状态,false始终返回1状态:

true
echo $? # echoes 0
false
echo $? # echoes 1

从手册中:(通过调用shell中的man bash访问)

  

$?扩展到最近执行的前台管道的退出状态。

按惯例,退出状态0表示成功,非零退货状态表示失败。详细了解退出状态 on wikipedia

您还可以在此在线手册中看到此类其他特殊变量:https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

答案 1 :(得分:13)

$?返回上次执行的命令的退出值。 echo $?在控制台上打印该值。零表示成功执行,而非零值映射到各种失败原因。

因此在编写脚本时;我倾向于使用以下语法

if [ $? -eq 0 ]; then
 # do something
else
 # do something else
fi

比较是等于0或不等于0

答案 2 :(得分:6)

它具有命令的最后一个状态代码(退出值)。

答案 3 :(得分:5)

echo $? - 提供最近执行的命令的退出状态。此退出状态很可能是一个ZERO暗示成功的数字,以及任何指示 失败

的非零值

- 这是bash中的一个特殊参数/变量。

$? - 它提供存储在变量“?”中的值。

BASH中的一些类似特殊参数是1,2,*,#(通常在echo命令中看作$ 1,$ 2,$ *,$#等)。

答案 4 :(得分:2)

来自http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

?
Expands to the exit status of the most recently executed foreground pipeline. 

答案 5 :(得分:2)

最小POSIX C退出状态示例

要了解$?,必须首先了解流程退出状态的概念。

在Linux中:

  • 当进程调用exit系统调用时,即使进程死亡,内核也会存储传递给系统调用的值。

    退出系统调用由exit() ANSI C函数调用,而当您从return执行main时间接调用。

  • 通常使用fork + exec调用退出子进程(Bash)的进程可以通过wait系统调用检索子进程的退出状态< / p>

考虑Bash代码:

$ false
$ echo $?
1

C的“等效”是:

false.c:

#include <stdlib.h> /* exit */

int main() {
    exit(1);
}

bash.c:

#include <unistd.h> /* execl */
#include <stdlib.h> /* fork */
#include <sys/wait.h> /* wait, WEXITSTATUS */
#include <stdio.h> /* printf */

int main() {
    if (fork() == 0) {
        /* Call false. */
        execl("./false", "./false", (char *)NULL);
    }
    int status;
    /* Wait for a child to finish. */
    wait(&status);
    /* Status encodes multiple fields,
     * we need WEXITSTATUS to get the exit status:
     * http://stackoverflow.com/questions/3659616/returning-exit-code-from-child
     **/
    printf("$? = %d\n", WEXITSTATUS(status));
}

在Bash中,当您按Enter键时,将发生如上的fork + exec + wait,然后bash将$?设置为分叉进程的退出状态。

注意:对于echo之类的内置命令,不需要生成进程,而Bash只需将$?设置为0即可模拟外部进程。

标准和文档

POSIX 7 2.5.2“特殊参数” http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02

  

?扩展到最新管道的十进制退出状态(请参阅管道)。

man bash“特殊参数”:

  

shell专门处理几个参数。这些参数只能被引用;不允许分配给他们。 [...]

     

?扩展到最近执行的前台管道的退出状态。

然后,ANSI C和POSIX建议:

  • 0表示程序成功

  • 其他值:程序以某种方式失败。

    确切的值可以指示故障的类型。

    ANSI C没有定义任何变量的含义,并且POSIX指定的值大于125:What is the meaning of "POSIX"?

Bash使用if的退出状态

在Bash中,我们经常隐式使用退出状态$?来控制if语句,如下所示:

if true; then
  :
fi

其中true是一个仅返回0的程序。

以上等同于:

true
result=$?
if [ $result = 0 ]; then
  :
fi

并在:

if [ 1 = 1 ]; then
  :
fi

[只是一个名称很奇怪的程序(其行为类似于Bash内置的Bash),其参数为1 = 1 ],另请参见:Difference between single and double square brackets in Bash

答案 6 :(得分:1)

请参阅The Bash Manual下的3.4.2 Special Parameters

  

? - 扩展到最近执行的前台管道的退出状态。

有点难以找到,因为它未列为$?(变量名称为“just”?)。当然,请参阅exit status部分; - )

快乐的编码。

答案 7 :(得分:1)

输出上次执行的unix命令的结果

0 implies true
1 implies false