赞
踩
http://blog.csdn.net/timo1160139211/article/details/74079553
最近学shell遇到了不理解的问题,到底数字0 1代不代表真假?现在去翻阅资料,做一深度的剖析和总结:
在许多教科书中,有明确的指出:“在shell程序中,0表示真,非0表示假,这一点与C语言恰恰相反。”(例如:《linux系统应用与开发教程》第3版 机械工业出版社)。“这一点与C语言恰恰相反” -- 我相信这误导了大量的阅读此类书籍的学生去默认的将shell的0 1与C语言的0 1比较,书中这段确实不明确,但我们不能断章取义,这部分的上一段中有提到:“判断的最终结果只有两种可能:真(0)或者假(非 0)”。也就是说,只有判断的结果返回值为0时为真,1为假。这一点尤其不可与C语言的while(1)混为一谈。
(全部源代码见 ->github<- )如果看不懂代码的含义,请先跳到下一部分 {知识点} 或者去 ->blog<- 见详解
- 这是一段bash代码,我们可以看到其中的 if [ ] 判断 0 1 真假情况,可是我们在紧跟的图中可以清楚的看到, if [ 0 ] 确实执行了,这表明,数字 0 在 [ ] 判断中不代表假。
源代码:
# bash trueOrNot.sh 返回结果:
- 我们再来看一种情况:-eq 比较两个整数的大小,从返回的结果可以看到,10==10为真时返回的却是 0 ,10==15为假时返回的是 1。
源代码:
# bash trueOrNot.sh 返回结果:
- 测试退出状态码:
源码:
执行结果:# bash trueOrNot.sh
测试退出状态码:# echo $?
结论见文章最后
[ ] : [ condition ] 为判断符,其中的条件condition为真返回 0,假返回 1 。
echo : echo str 打印字符串 str (默认换行)
-eq : int1 -eq int2 是整数相等判断符,两边整数相等时返回真 0,否则返回假 1 。
$? : $ 符号用来引用变量的值,? 是一个特殊的变量,存储紧邻的前驱命令执行的返回值,$? 一般组合用来检查上一个命令执行结果的返回值。
exit : exit 0~255 ,用来返回自己的退出状态码,超过255的值 将被自动执行 模256的运算。
正确的认识:
- 每个表达式执行完退出的时候,都会返回一个退出状态码(exit status 0~255),if语句根据 [ ] 表达式执行的退出状态码进行判断,在所有的退出状态码中,0表示执行成功,1~255为退出的状态代号(详见下表)。所以,与C语言不同的就在这里,shell的if [ 1 ] 中整数 0 1 与C语言中的 while(1)用法并不相通,也就是说整数 0 1 作为退出状态码的时候,确实表示真假,但是并不能作为 if [ ] 的判断条件来用,虽然shell也是弱数据类型的语言。
- # The final conclusion is :
- # 1. each expression will return a value between 0 and 255.
- # 2. the state value 0 means that the expression finished fluently.
- # 3. others state values means expression exit with an exception.
Linux退出状态码(常):
状态码: 描述: 0 命令成功结束 1 通用未知错误 2 误用shell命令 126 命令不可执行 127 没找到命令 128 无效退出参数 130 通过Ctrl + C 终止
参考资料:
《Linux命令行与shell脚本编程大全》人民邮电出版社;
建议不要看的书:
《Linux系统应用与开发教程》第3版 机械工业出版社。(建议不要再作为高校教材使用了)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。