为啥是“$”的值?在“如果”条件下发生了变化?
Posted
技术标签:
【中文标题】为啥是“$”的值?在“如果”条件下发生了变化?【英文标题】:Why is the value of "$?" changed in the "if" condition?为什么是“$”的值?在“如果”条件下发生了变化? 【发布时间】:2015-12-07 18:03:20 【问题描述】:我对“$?”的值感到困惑。在我的 shell 脚本中。我写了一个演示脚本如下:
#!/bin/bash
echo "good"
if [ $? -ne 0 ];then
echo "$? not equal 0"
else
echo "$? equal 0"
fi
echo "good"
ret=$?
if [ $ret -ne 0 ];then
echo "$ret not equal 0"
else
echo "$ret equal 0"
fi
我知道,“$?”用于保存最后一个函数或命令的返回值,但是为什么输出如下?
good
1 equal 0
good
0 equal 0
这是否意味着[ $? -eq 0 ]
也是一个命令或函数?我很困惑!
【问题讨论】:
因为即使[ $? -ne 0 ]
是一个被评估的表达式,并且在执行后状态被放置在$?
中
为了记录,一个惯用的 shell 脚本几乎不需要检查$?
。通常的语法就是if echo good; then echo "$? equal 0"; else echo "$? not equal to 0"; fi
。您会注意到,这还将 $?
的值保留到条件内部。
是的,但有时它很有用。非常感谢
【参考方案1】:
您的原始代码可以重写为:
$ if echo "good"; then echo "$? equal 0"; fi
good
0 equal 0
由于您的代码仅检查 echo 命令的退出值,因此它几乎总是会返回 0(例如“true”),除非其文件描述符已关闭。例如:
$ echo foo; echo $?
foo
0
$ echo bar >&- ; echo $?
-bash: echo: write error: Bad file descriptor
1
【讨论】:
感谢您的帮助,我理解您的示例,但我仍然感到困惑的是为什么 $ 的价值?在第一个测试脚本中改变了吗?正如你所说,如果这意味着它的原始文件描述符在条件“ if [ $? -ne 0 ];then ...”之后关闭?非常感谢以上是关于为啥是“$”的值?在“如果”条件下发生了变化?的主要内容,如果未能解决你的问题,请参考以下文章
为啥actionbar sherlock的横向高度会发生变化?
为啥在多模块调试的情况下$monitor需要配合$monitoron和$monitoroff来工作