【问题标题】:what is the benefit of $? in bash [duplicate]美元有什么好处?在 bash [重复]
【发布时间】:2023-03-07 00:58:01
【问题描述】:

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

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

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

【问题讨论】:

  • 很确定这个论坛已经有答案了,就外壳而言,$? 的值是否为零,这意味着它是真的,否则它是假的。例如,如果最近的命令成功,这意味着 $? 的值为零,则可以对其执行操作,执行另一个命令或执行其他操作。
  • 可以举个小例子
  • stackoverflow.com/questions/7248031/… 这能回答你的问题吗?
  • @frankmark,我告诉过你,这个论坛已经有答案了,只需要在发布新问题之前先搜索一下,如果你发现那个链接中的帖子就是你要找的为,请点击向上的箭头/三角形投票。

标签: linux bash git-bash


【解决方案1】:

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

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

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

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;
    }
}

如果我在命令行中以./a.out true 运行它,那么这个程序将返回0,并且$? 变量也将设置为0。但是,如果我输入./a.out false,程序将返回1,而$? 也将设置为1,这表明出现了问题。

如果你只是在命令行中玩弄,运行命令然后echo $? 来查看结果,这似乎是相当多余的,但这在 Bash 脚本中非常有用,你可能想看看你的命令是什么刚跑回来。例如,如果您指定的两个文件没有区别,diff 命令返回 0,如果有区别,则返回 1。这为将一些控制流引入您的程序提供了一种简洁的方法,但您必须小心,因为$? 是在您运行的每个命令之后设置的。

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 2018-02-14
    • 2014-04-12
    • 2017-05-14
    • 1970-01-01
    • 2016-08-15
    • 2013-08-18
    相关资源
    最近更新 更多