免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: xinyv
打印 上一主题 下一主题

bash 判断语句问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2009-06-03 15:34 |只看该作者
原帖由 linuxleio 于 2009-6-1 18:09 发表
这个可以说是shell对逻辑表达式语法检测的问题:

A && B   #如果A为true,则还要运行表达式B,判断其是否也为true;如果A为fale,整个逻辑表达式就为fale,会跳过运行表达式B。

A || B  #如果A为fal ...



你说的理论很正确。那类似楼主的两个逻辑操作符写到了一行,我在补充下,也解释了前面“kwokcn   帅哥  (狼烟) ”的两个例句


A && B || C

如果A为true,&&符必须进行B的判断,B也为true则C就不会执行了。但是B自身却是0,则 A && B整个为false,判断结束做b++运行,同时执行C。
例子:
a=0;b=0;c=0;((a==0))&&((b++))||((c++)); echo $a,$b,$c
结果:0,1,1

如果b=1,那么在判断b++时,b自身就是true,则 A && B 整个为true,就不执行C了。这也就是前面朋友执行下面例句,结果为0,2,0的原因了。
a=0;b=1;c=0;((a==0))&&((b++))||((c++)); echo $a,$b,$c
结果:0,2,0



另外,题外话,给你个建议,类似这种判断最好用if判断,逻辑操作符有些副作用,还有shell中0为真,非0为假,perl中0和空为false,其他为真。差别很大,容易混乱。

[ 本帖最后由 coffee_45 于 2009-6-3 15:53 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2009-06-03 15:43 |只看该作者

回复 #31 coffee_45 的帖子

怎么都说是true、false ?

A && B || C
如果A返回0则运行B,C运行不运行只看B的返回值是否为非0

对于A && B ,应该说A运行的返回值($?)为0,则执行B
对于A || C,A运行的返回值($?)为非0,则执行B

  1.         command1 && command2

  2.        command2 is executed if, and only if, command1 returns an  exit  status
  3.        of zero.
复制代码
  1.          command1 ││ command2

  2.        command2  is  executed  if and only if command1 returns a non-zero exit
  3.        status.  The return status of AND and OR lists is the  exit  status  of
  4.        the last command executed in the list.
复制代码


还有黑哥23楼说的:&& || 的优先级别相等,从左至右运算。
A && B || C

[ 本帖最后由 ywlscpl 于 2009-6-3 16:01 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2009-06-03 16:08 |只看该作者
原帖由 ywlscpl 于 2009-6-3 15:43 发表
怎么都说是true、false ?


   ...



呵呵,这位哥们,你分析返回值来作判断,非常对。
我们说的也和你没冲突,只所以shell判断为true就是根据返回值是否为0来判断的,((0))的返回值就是1。
我们这么说只是觉得这样容易些。

论坛徽章:
0
34 [报告]
发表于 2009-06-03 16:17 |只看该作者

回复 #33 coffee_45 的帖子

继续探讨

按你说的就是某个命令执行后会有一个true、false的状态,而究竟是true还是false shell是根据这个命令执行后的返回值来判断
越说越乱了,其实感觉这个true、false只是一般上自己的理解,shell还是直管执行一个命令,然后返回一个$?

[ 本帖最后由 ywlscpl 于 2009-6-3 16:19 编辑 ]

论坛徽章:
0
35 [报告]
发表于 2009-06-03 16:20 |只看该作者
原帖由 ywlscpl 于 2009-6-3 16:17 发表
继续探讨

按你说的就是某个命令执行后会有一个true、false的状态,而究竟是true还是false shell是根据这个命令执行后的返回值来判断




兄弟,我可没说执行后会有一个true,false状态啊,这个true,false是讲给人听的。你强调0,1都是给程序看的。

我们这不是给楼主分析和广大网友看的吗,((0))返回1,((1))返回0,shell以0为真,非0为假,这么说不觉得容易蒙吗。



打住,我不说了,看出来楼上兄弟是个专门写程序的了,比较在乎程序的看法。

我经常会接触客户,比较在乎客户是否能明白。

呵呵,没谁对谁错,大家都对。

[ 本帖最后由 coffee_45 于 2009-6-3 16:24 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2009-06-03 16:31 |只看该作者

回复 #35 coffee_45 的帖子

呵呵,我只是觉得既然是分析,那就严谨些

bash对A && B、A || C的形式已经很明确了,根据返回值来判断
那么对于(( A == 0)) && ((B++)) || ((C++)),我们只需判断各自命令的返回值就可以了
至于 ((expression)) 这种形式命令的返回值,man bash后也可以明确

我倒是觉得又加入了真(true)、假(false)的概念,对于本题的解析会产生混淆。

论坛徽章:
0
37 [报告]
发表于 2009-06-03 18:25 |只看该作者

回复 #25 ywlscpl 的帖子

这个分析的很好,受益很大啊

论坛徽章:
0
38 [报告]
发表于 2009-06-06 10:06 |只看该作者
  1. 其实就是个a && b  a真就继续执行b,反之就不执行b了
  2.              c || d  c真d就不执行了,反之执行d
  3.             i++这种是先用  后加了
  4.            shell真为0有点和c不一样,就这么点东东把
  5. |
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP