LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 770|回复: 4

&&和||的问题

[复制链接]
发表于 2011-11-16 20:53:13 | 显示全部楼层 |阅读模式

  1. a=0; [ "$a" -eq 0 ] && let a++ || echo n$a
复制代码

结果怎么会是这样?:
n1
完全蒙了!!!

如果用 if

  1. a=0; if [ "$a" -eq 0 ]; then let a++; else echo n$a; fi
复制代码

却能够得到需要的结果:
(没有输出)
发表于 2011-11-18 09:32:41 | 显示全部楼层
这压根和&&||毫无关系,它们就是按照你想的那样短路求值。
你咋不看看let a++的返回码咧?
  1. $ true
  2. $ echo $?
  3. 0
  4. $ a=0
  5. $ let a++
  6. $ echo $?
  7. 1
复制代码
为神马?因为a=0,所以a++求值为0,然后你看bash(1)
       let arg [arg ...]
              Each arg is an arithmetic expression to be evaluated (see ARITHMETIC EVALUATION above).  If the last arg evaluates to 0, let returns 1; 0
              is returned otherwise
.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-18 10:36:26 | 显示全部楼层

终于搞明白

谢谢!
原来是 let 惹得祸;
也真巧,刚好用到 a=0,结果let a++的 $? 为 1;

另:
a=0,a++求值为1,只是返回码也是1

另2:
还是有些奇怪,下面语句却没有问题

  1. a=0; [ "$a" -eq 0 ] && let ++a || echo n$a
  2. a=0; [ "$a" -eq 0 ] && let a+=1 || echo n$a
复制代码

难道是 let 和 a++ 不能结合?哈哈
而且上面两个语句执行结果也和手册说明不符,会不会是 bash 的 bug ?
注:F15下。

看明白了,let 运算值为0的话,返回值总是1 !!!
再次谢谢!
回复 支持 反对

使用道具 举报

发表于 2011-11-19 11:04:41 | 显示全部楼层
这是 ++a 和 a++ 以及 a+=1 的区别了。楼主可以看看基础。
回复 支持 反对

使用道具 举报

发表于 2011-11-19 11:16:29 | 显示全部楼层
a++,返回的a的值是0,而++a返回的a的值是1,bash里已经说了,最后的求值是0,let 返回一个1的值,就跟$?一样,1是执行失败的。

这才是你要的答案:

$ a=0;if [ "$a" -eq 0 ] && let a++;then echo OK;else echo NO;fi
NO
$ a=0;if [ "$a" -eq 0 ] && let ++a;then echo OK;else echo NO;fi
OK
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表