$的含义? shell脚本中的(美元问号)

问题描述 投票:120回答:7

是什么

echo $?

shell编程意味着什么?

bash shell scripting special-characters
7个回答
164
投票

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

例如,命令true总是返回0的状态,false总是返回1的状态:

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

从手册:(可通过在shell中调用qazxsw poi访问)

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

按照惯例,$?的退出状态意味着成功,非零返回状态意味着失败。了解退出状态0的更多信息。

还有其他特殊变量,如本在线手册所示:on wikipedia


16
投票

https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters返回上次执行的命令的退出值。 $?在控制台上打印出这个值。零表示成功执行,而非零值映射到各种失败原因。

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

echo $?

比较是在等于if [ $? -eq 0 ]; then # do something else # do something else fi 或不等于0

**更新根据评论:理想情况下,您不应使用上述代码块进行比较,请参阅@tripleee评论和解释。


6
投票

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


6
投票

回声$? - 给出最近执行的命令的退出状态。此EXIT STATUS很可能是一个数字,其中ZERO表示成功,任何NON-ZERO值表示失败

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

$? - 它给出了存储在变量“?”中的值。

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



1
投票

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

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

1
投票

请参阅0 implies true 1 implies false 下的The Bash Manual

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

它有点难以找到,因为它没有被列为3.4.2 Special Parameters(变量名称是“just”$?)。当然也参见?部分;-)

快乐的编码。


1
投票

最小C的例子

要了解exit status,您必须首先了解流程退出状态的概念。

在Linux中:

  • 当进程调用$?系统调用时,即使进程终止,内核也会存储传递给系统调用的值。 退出系统调用由exit ANSI C函数调用,并且当您从exit()执行return时间接调用。
  • 通过main + fork调用退出子进程(Bash)的进程可以使用exec系统调用检索子进程的退出状态

考虑Bash代码:

wait

C“等价物”是:

false.c:

$ false
$ echo $?
1

bash.c:

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

int main() {
    exit(1);
}

在Bash中,当你按Enter键时,fork + exec + wait会像上面那样发生,然后bash会将#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只需将echo设置为0即可模拟外部进程。

标准和文件

POSIX 7 2.5.2“特殊参数”$?

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

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

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

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

ANSI C和POSIX然后建议:

  • man bash意味着该计划取得了成功
  • 其他值:程序以某种方式失败。 确切的值可以指示失败的类型。 ANSI C未定义任何vaues的含义,POSIX指定大于125的值:0

Bash使用What is the meaning of "POSIX"?的退出状态

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

if

其中if true; then : fi 是一个只返回0的程序。

以上相当于:

true

并在:

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

if [ 1 = 1 ]; then : fi 只是一个具有奇怪名称的程序(和Bash内置的行为类似),[它的参数,参见:1 = 1 ]

© www.soinside.com 2019 - 2024. All rights reserved.