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


23

这个问题很简单。我可以使用来获得上一个命令的退出代码$?。但是到底是什么呢?

我认为这不是变量,因为您不能在变量的名称中使用除之外的任何特殊字符_

foo?foo=10

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

那么,如果它不是变量,那是什么?还有其他喜欢的人吗?


Answers:


23

它是什么?

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

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

还有其他人喜欢吗?

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


1
因此,仅在bash shell中可用吗?
daltonfury42

4
@ daltonfury42没有任何外壳,企图与Bourne shell的一些兼容性将支持它(包括dashkshzsh,等等)。
muru

2
csh和鱼$status用于相同目的
glenn jackman 2015年

22

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

它不是唯一的,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 $@.

资料来源:


2
"$*"不仅是单个单词的所有位置参数,而且是单个单词的第一个字符分隔的所有位置参数IFS。由于如果不加引号,则结果将进行字段拆分,因此效果$@与未加引号的情况相同。
muru

1
可以肯定的:不带引号$ @ $和*是相同的,因为它们受到分词。用引号引起来,“ $ @”保留位置参数的单词拆分,即使单个参数在IFS中包含字符也是如此。
kojiro

1
自从将其用于shell以来,是否有参考?我想知道Perl是否从shell脚本中获取了这些。
simbabque 2015年

这比Perl早了几十年(或至少几年)。很多Perl语法都受到shell语法的影响。(Perl于1987年出生,其中许多语法来自原始的Bourne shell(1977)。引入$ _时我不是100%,但几乎可以肯定的是1987
Popup

6

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

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

简而言之,$?是一个特殊变量(并且有很多这样的变量),可以将其视为外壳程序本身的内部功能,该外壳程序提供上一个命令的退出代码(成功或失败)。

您可以阅读此内容以获取有关变量的更多信息。


4

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

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

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

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


Shell函数是POSIX兼容的方法,用于设置退出状态而不必进行分叉。setstatus() { return 5; }
kojiro 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.