为啥是“$”的值?在“如果”条件下发生了变化?

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来工作

为啥“x”的值发生了变化? [复制]

如果 java 是按值传递的,为啥我的对象在执行方法后会发生变化?

vue为啥method值不改

为啥尽管输入的值确实发生了变化,但 jquery 更改事件却没有触发? [复制]