免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3419 | 回复: 7
打印 上一主题 下一主题

诡异的"退出状态码" [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-16 15:12 |只看该作者 |倒序浏览
abs 81页上面有这样的介绍.


(( ))结构扩展并计算一个算术表达式的值. 如果表达式的结果为0, 那么返回的退出状态码为1, 或者
是"假". 而一个非零值的表达式所返回的退出状态码将为0, 或者是"true". 这种情况和先前所讨论
的test命令和[ ]结构的行为正好相反.

例子 7-3. 算术测试需要使用(( ))
1 #!/bin/bash
2 # 算术测试.
3
4 # (( ... ))结构可以用来计算并测试算术表达式的结果.
5 # 退出状态将会与[ ... ]结构完全相反!
6
7 (( 0 ))
8 echo "Exit status of \"(( 0 ))\" is $?." # 1
9
10 (( 1 ))
11 echo "Exit status of \"(( 1 ))\" is $?." # 0
12
13 (( 5 > 4 )) # 真
14 echo "Exit status of \"(( 5 > 4 ))\" is $?." # 0
15
16 (( 5 > 9 )) # 假
17 echo "Exit status of \"(( 5 > 9 ))\" is $?." # 1
18
19 (( 5 - 5 )) # 0
20 echo "Exit status of \"(( 5 - 5 ))\" is $?." # 1
21
22 (( 5 / 4 )) # 除法也可以.
23 echo "Exit status of \"(( 5 / 4 ))\" is $?." # 0
24
25 (( 1 / 2 )) # 除法的计算结果 < 1.
26 echo "Exit status of \"(( 1 / 2 ))\" is $?." # 截取之后的结果为 0.
27 # 1
28
29 (( 1 / 0 )) 2>/dev/null # 除数为0, 非法计算.
30 # ^^^^^^^^^^^
31 echo "Exit status of \"(( 1 / 0 ))\" is $?." # 1
32
33 # "2>/dev/null"起了什么作用?
34 # 如果这句被删除会怎样?
35 # 尝试删除这句, 然后在运行这个脚本.
36
37 exit 0



13 (( 5 > 4 )) # 真
14 echo "Exit status of \"(( 5 > 4 ))\" is $?." # 0
15
16 (( 5 > 9 )) # 假
17 echo "Exit status of \"(( 5 > 9 ))\" is $?." # 1
18

按最上面换的意思来说,5>4 是这个表达式的值为为真,相当于((0)),应该返回1才对吧.
如果不按上面的话来,从逻辑上来看((5>4))是真,应该返回0的.

还有let "1<2" return 0 (as 1<2 expands to "1") 这句话何解???

论坛徽章:
0
2 [报告]
发表于 2011-06-16 15:54 |只看该作者
路过帮顶

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2011-06-17 08:51 |只看该作者
shell里用0表示真,其他表示假

论坛徽章:
0
4 [报告]
发表于 2011-06-17 15:25 |只看该作者
回复 3# cjaizss


    是啊,但是从上面列子看是反的哦.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2011-06-17 15:34 |只看该作者
回复  cjaizss


    是啊,但是从上面列子看是反的哦.
demoyy 发表于 2011-06-17 15:25



    你理解错了

论坛徽章:
0
6 [报告]
发表于 2011-06-17 21:31 |只看该作者
例子是对的,楼主理解错了

论坛徽章:
0
7 [报告]
发表于 2011-06-17 22:15 |只看该作者
本帖最后由 ywlscpl 于 2011-06-17 22:20 编辑

shell中$?为上一命令的返回值,一般0表示上一命令执行成功,非0表示上一命令执行失败或异常。

大家在shell脚本中经常可以见到,遇到参数输入错误,或异常情况,脚本exit 1;而在脚本的最后一般加一句
exit 0。这样做的目的一是让程序阅读更清晰,更重要的是使脚本的执行结果就可以被别的脚本或程序所使用,比如判断脚本a的执行结果,如果$?为1,执行命令a1;如果$?为0,执行命令a2

$?=0表示执行成功,$?不为0表示失败或其他异常情况,这是默认规则,基本上的linux系统命令都遵循这个规则,也是大家写脚本或程序约定俗成的规则。当然写脚本或程序时完全可以反着来,或乱着来,exit 后面跟的值只要在0-255之间都可以
=============================

现在说说楼主说的这些例子
       ((expression))
              The  expression  is  evaluated  according to the rules described
              below under ARITHMETIC EVALUATION.  If the value of the  expres-
              sion  is  non-zero, the return status is 0; otherwise the return
              status is 1.  This is exactly equivalent to let "expression".

man bash解释的很简洁,((表达式))等价于  let   表达式,也就是数学表达式运算
表达式值非0,返回值为0,否则返回值为1

(( 0 ))    ---表达式值为0,返回1
(( 1 ))    --非0,返回0
(( 5 > 4 )) --真,非假,也即非0,返回0
(( 5 > 9 ))-- 假,即0,返回1
(( 5 - 5 )) --0,返回1
(( 5 / 4 )) --值为1,非0,返回0,
(( 1 / 2 )) --值为0,返回1。(shell中除法无小数,直接取整)
(( 1 / 0 )) --非法运算,直接返回1

论坛徽章:
0
8 [报告]
发表于 2011-06-19 11:48 |只看该作者
谢谢各位,,是我理解错了。
比较表达式的真假 是非0代表真,0代表假。
再次谢谢各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP