$的好处是什么?在 bash

what is the benefit of $? in bash

我是 bash 变量概念的新手,我看过一些课程如何使用以及何时使用 $# 等特殊变量来查看在 bash 脚本中传递了多少参数和 $@ 查看提供给 Bash 脚本的所有参数。

但是我没看懂 $?他们只是说 $? (最近运行进程的退出状态)而且我什么也没有。

我需要一点解释,请举个例子。

您给出的定义,即最近 运行 进程的退出状态,正是这样;但是如果您不了解进程和命令在命令行上的一般工作方式,我可以理解这可能有点令人困惑。

一般来说,您在命令行上 运行 的任何命令都会有一个退出代码。在类似 C/C++ 的东西中,您可能将其视为附加在每个 main() 例程末尾的 return 0;,而在 shell 脚本中您可能将其视为exit 0。这些 return 代码是向外部环境(在本例中为终端)发出信号的主要方式,表明事情要么顺利结束,要么没有结束。

这就是 $? 发挥作用的地方。 Unix 系统上的约定是如果一切正常,进程 return 退出代码 0,如果没有,则 return 一个非零值。所以,假设我写了一个简单的主程序,如下所示:

int main(int argc, char* argv[]) {
    if (argv[1] == "true") {  // not quite right, but fine for examples
        return 0;
    }
    else if (argv[1] == "false") {
        return 1;
    }
}

如果我在命令行中 运行 this 作为 ./a.out true,那么这个程序将 return 0 并且 $? 变量也将设置为 0。但是,如果我键入 ./a.out false,程序将 return 1 并且 $? 也将设置为 1,这表明出现了错误。

如果你只是在命令行中玩弄,这似乎是多余的,运行ning 命令然后 echo $? 查看结果,但这在 Bash 脚本,您可能想在其中查看您刚刚 运行 return 的命令。例如,diff 命令 returns 如果您指定的两个文件没有不同则为 0,如果不同则为 1。这提供了一种将一些控制流引入您的程序的巧妙方法,但是您 必须小心 ,因为 $? 是在 every[=38= 之后设置的]命令你运行.

希望对您有所帮助!