免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
21 [报告]
发表于 2009-06-01 15:24 |只看该作者

回复 #2 xinyv 的帖子

又看了遍十三问,感觉这个问题的本质就是
&& || 的写法和 if 的区别

cmd1 && cmd2 || cmd3

cmd3 是否执行,不仅仅取决于cmd1,还要看cmd2

论坛徽章:
0
22 [报告]
发表于 2009-06-01 15:24 |只看该作者
楼主不提之前还真没注意过,以后用&&、||的时候还是直接x=$((...))算了……

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
23 [报告]
发表于 2009-06-01 15:30 |只看该作者
&& || 的优先级别相等,从左至右运算。
cmd1 && cmd2 || cmd3 应该是相当于 {cmd1 && cmd2;}  || cmd3

论坛徽章:
1
摩羯座
日期:2015-01-08 14:01:55
24 [报告]
发表于 2009-06-01 16:46 |只看该作者
a=0 && let a++ && echo $?
b=1 && let --b && echo $?
楼主这么运行就知道为什么了。
((a++))代替let a++一样的。

论坛徽章:
0
25 [报告]
发表于 2009-06-01 16:49 |只看该作者
看了上面大牛们的分析,感觉关键还是在于((var))、((B++))这种命令的返回值上,说一下自己的理解

1、((var))这种形式的返回值:var值为0或非整数值返回值为1,var为非0整数值返回值为0
  1. [root@Mylinux tmp]# var=0
  2. [root@Mylinux tmp]# ((var));echo $?
  3. 1
  4. [root@Mylinux tmp]# ((var));echo $?
  5. [root@Mylinux tmp]# var=1
  6. [root@Mylinux tmp]# ((var));echo $?
  7. 0
  8. [root@Mylinux tmp]# var=-1
  9. [root@Mylinux tmp]# ((var));echo $?
  10. 0
  11. [root@Mylinux tmp]# var="xx"
  12. [root@Mylinux tmp]# ((var));echo $?
  13. 1
  14. [root@Mylinux tmp]# var=1.1
  15. [root@Mylinux tmp]# ((var));echo $?
  16. -bash: ((: 1.1: syntax error in expression (error token is ".1")
  17. 1
复制代码


2、(( var == var1 ))的返回值,((var==var1))形式应该相同
    比较var与var1值,相同返回0,不同返回1
      需注意的是若var1为字符串,则((var==var1))相当于((var==0))
  1. [root@Mylinux tmp]# a=0
  2. [root@Mylinux tmp]# ((a==0));echo $?
  3. 0
  4. [root@Mylinux tmp]# ((a==1));echo $?
  5. 1
  6. [root@Mylinux tmp]# ((a==5));echo $?
  7. 1
  8. [root@Mylinux tmp]# ((a==x));echo $?
  9. 0
  10. [root@Mylinux tmp]# ((a=="x"));echo $?
  11. 0
  12. [root@Mylinux tmp]# ((a==1.1));echo $?   
  13. -bash: ((: a==1.1: syntax error in expression (error token is ".1")
  14. 1
  15. [root@Mylinux tmp]# a=1
  16. [root@Mylinux tmp]# ((a==1);echo $?
  17. >
  18. [root@Mylinux tmp]# ((a==1));echo $?
  19. 0
  20. [root@Mylinux tmp]# ((a==0));echo $?
  21. 1
  22. [root@Mylinux tmp]# ((a==5));echo $?
  23. 1
  24. [root@Mylinux tmp]# ((a=="x"));echo $?
  25. 1
  26. [root@Mylinux tmp]# ((a==x));echo $?  
  27. 1
复制代码

3、B++这种形式的变量引用规则,遵循c语言,先引用后自增计算

结合上面3点,看本题
A=0  B=0  C=0
(( A == 0 )) && ((B++)) || ((C++))

1、A值为0,(( A == 0 ))返回0,返回值为0所以运行后面的((B++))
2、B值为0,先引用后自增,B++后B值为1,((0))返回值为1所以运行后面的((C++))
3、C++后C值为1

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
26 [报告]
发表于 2009-06-01 17:00 |只看该作者

回复 #25 ywlscpl 的帖子

够详细的。

参考man bash.

论坛徽章:
0
27 [报告]
发表于 2009-06-01 17:05 |只看该作者

回复 #26 blackold 的帖子

嗯,还是男人好啊
  1. ((expression))
  2.               The  expression  is  evaluated  according to the rules described
  3.               below under ARITHMETIC EVALUATION.  If the value of the  expres-
  4.               sion  is  non-zero, the return status is 0; otherwise the return
  5.               status is 1.  This is exactly equivalent to let "expression".
复制代码

论坛徽章:
0
28 [报告]
发表于 2009-06-01 17:27 |只看该作者
谢谢大家这么关心这个讨论.

  1. A=0 ;echo $?

  2. ((A=0));echo $?
复制代码


这两个结果是不同的,要判断一个东西,首先要明白我们要判断的是过程还是结果。
    第一个面向过程,只要赋值的过程成功就返回 true
    第二个面向结果,就是判断A是否非零。 为零当然就是 false

吸取教训,一个脚本让我调试了半天, () 要慎用

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
29 [报告]
发表于 2009-06-01 17:52 |只看该作者

回复 #28 xinyv 的帖子

搞复杂了。

论坛徽章:
0
30 [报告]
发表于 2009-06-01 18:09 |只看该作者
这个可以说是shell对逻辑表达式语法检测的问题:

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

A || B  #如果A为fale,会接着运行表达式B,以此判断整个逻辑表达式样的结果;若A为true,整个逻辑表达式为true,会跳过运行表达式B
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP