我看到代码写在网上的某个地方,我想知道究竟是什么“$?”做/给我们。 谷歌搜索没有帮助。
这是我在其中看到的代码:
#!/bin/sh
ping -c 2 localhost
if [ $? != 0 ] ; then
echo "Couldn't ping localhost, weird"
fi
ping -c 2 veryweirdhostname.noend
if [ $? != 0 ] ; then
echo "Surprise, Couldn't ping a very weird hostname.."
fi
echo "The pid of this process is $$"
取自:http://efod.se/writings/linuxbook/html/shell-scripts.html
答案 0 :(得分:35)
$?
是一个变量,它保存您运行的最后一个命令的返回值。
示例C程序(example.c
):
int main() { return 1; }
示例Bash:
gcc -o example example.c
./example
echo $? # prints 1
答案 1 :(得分:12)
大多数答案都缺少一些细节。在POSIX standard for the shell, in the section on special parameters:
中找到了明确的答案$?扩展到最近管道的十进制退出状态 (见管道)。
不要对 pipeline 这个词感到惊讶,因为即使像ls
这样的简单命令在语法上也是由单个命令组成的管道。但是,对于多命令管道来说,$?
是什么?它是管道中 last 命令的退出状态。
那么在后台执行的管道如grep foo bigfile|head -n 10 > result &
?
管道的最后一个命令完成后,可以通过wait
检索它们的退出状态。
后台进程pid以$!
提供,$?
仅报告后台命令是否正确已启动。
值得一提的另一个细节是退出状态通常在0到255的范围内,128到255表示由于信号而退出的过程。从{C}程序返回其他值可能无法在$?
中准确反映。
答案 2 :(得分:6)
这是最近执行的命令的返回码。
按惯例,0表示成功退出,非零表示某种错误。
答案 3 :(得分:1)
此特殊变量显示在脚本或命令行中运行的最后一个命令的退出状态。例如,在命令行中,用户可以键入
who; echo $?
输出将是
user tty7 2014-07-13 19:47
0
显示的输出和命令的退出状态。一个脚本是一样的。
#!/bin/bash
who
echo $?
输出:0
答案 4 :(得分:0)
其他答案很好地涵盖了bash,但你没有在你的问题中指定一个shell。在csh(和tcsh)中,$?
可用于query the existence of variables,例如。
if $?my_var then
echo my_var exists
endif