在shell脚本中,"$?"代表什么意思?

15

我发现了一个包含以下语句的Shell脚本:

if [ $val -eq $? ]

这里的$?是什么意思?


这是你问题的答案,可能与你的问题相匹配。 - Romit M.
1
可能是什么是特殊的美元符号shell变量?的重复。 - hammar
https://swcarpentry.github.io/shell-novice/reference/ - Channa
6个回答

26
我发现这个链接非常有用,是一个很好的答案。它包括了清晰的表述和示例。

输入图像描述


22
$?

返回最近一个完成的命令的状态。
状态 0 表示一切正常完成。

此外,$ 符号是一个特殊的符号 - 在这种情况下,$val 提取由变量 val 所保存的值。


17

$# = 参数个数。答案是3

$@ = 传递的参数。答案是1 2 3

$? = 上一个命令是否成功执行。答案是0,表示“是”。


1
也许这不应该影响我,但“0 == True”这个事实真的让我感到非常恼火。 - jmracek

3

这里的$?是指退出状态的最后结果,0默认表示“成功”。

bash# ls *.*
bash# echo $? 
bash# 0
bash# ls /tmp/not/existing/
bash# echo $?
bash# 2

2

这是上一个命令的退出状态值。如果成功,该值为0


-1

ls *.* 或者 ls 会产生相同的结果。它的意思是在当前目录中显示一个或多个具有任何扩展名的文件。

echo $? 会显示退出状态码。如果上一个命令至少显示了一个文件,则退出状态码为零(成功)。


不完全正确:ls *.*将过滤当前目录的内容,并仅显示其中带有句点的文件和目录;对于目录,它将显示其内容(可能取决于实现)。还请查看以下命令mkdir test && cd test && ls; echo "$?"将返回0。但是,mkdir -m -r wo_dir && cd wo_dir && echo "test" > 1.txt && ls; echo "$?"将返回1,并显示消息ls: .: Permission denied,即使文件已创建。 - artdanil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接