什么是“$?”?它是一个变量吗?

dal*_*y42 25 command-line bash

这个问题很直接。我可以使用$?. 但究竟是什么呢?

我不认为它是一个变量,因为除了_.

foo?foo=10
Run Code Online (Sandbox Code Playgroud)

将导致错误: foo?foo=10: command not found

所以如果它不是一个变量,它是什么?还有其他人喜欢吗?

Ron*_*Ron 24

它是什么?

$? 是一个内置变量,用于存储命令、函数或脚本本身的退出状态。

$?读取最后执行的命令的退出状态。函数返回后,$?给出函数中执行的最后一个命令的退出状态。这是 Bash 给函数一个“返回值”的方式。它返回0成功或1 - 255错误范围内的整数。

有其他人也喜欢吗?

是的,bash 中有几个这样的内置变量。您可以在此处查看列表。参考:http : //www.tldp.org/LDP/abs/html/exit-status.html

  • @daltonfury42 不,任何试图与 Bourne shell 兼容的 shell 都将支持它(包括 `dash`、`ksh​​`、`zsh` 等)。 (4认同)
  • csh 和fish 使用`$status` 来达到同样的目的 (2认同)

Syl*_*eau 24

$?是一个变量但是一个特殊的,这就是为什么允许特殊字符的原因。 ($?)扩展到最近执行的前台管道的退出状态。

它不是唯一的,shell 对几个参数进行了特殊处理。这些参数只能被引用;不允许分配给他们:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.
Run Code Online (Sandbox Code Playgroud)

资料来源:

  • `"$*"` 不仅仅是将所有位置参数作为一个单词,而是将所有由 `IFS` 的第一个字符分隔的位置参数作为一个单词。由于如果不引用结果将受到字段拆分的影响,因此效果就像在未引用的情况下使用了`$@`。 (2认同)

hee*_*ayl 6

$?是一个特殊的shell 参数(变量)。

通常,所有用户定义的变量必须仅使用字符类[:alnum:]ie 中的字符命名[a-zA-Z0-9_](也不能以 开头[0-9])。

简而言之,$?是一个特殊的变量(其中有很多),它可以被认为是 shell 本身的内部特征,它提供了前一个命令的退出代码(无论是成功还是失败)。

您可以阅读本文以了解有关变量的更多信息。


Byt*_*der 5

$?是 bash 中的一个特殊变量,它始终保存上次执行命令的返回/退出代码

您可以通过运行在终端中查看它echo $?

返回代码在范围 [0; 255]。
返回码0通常表示一切正常。
其他值表示错误。大多数应用程序返回1或自定义值。如果未找到命令,则变量通常包含127

如果您想将此变量设置为特定值,您可以轻松地执行此操作bash -c "exit 5"以返回例如返回代码5