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)混为一谈。

  • 那么,到底 0 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版  机械工业出版社。(建议不要再作为高校教材使用了)

shell真假01的真相相关推荐

  1. shell mysql版本_MySQL Shell:01 从入门到蒙圈

    原标题:MySQL Shell:01 从入门到蒙圈 春节马上到了,小伙伴们感受到氛围已经纷纷开溜.(没氛围?华仔的恭喜发财可以让你马上感受下) 中国人过年要有仪式感,包饺子,贴春联,放鞭炮.换红裤衩. ...

  2. shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中

    需求:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中 思路:我们的命令都是存在了历史文件/root/.bash_history 这个文件里面,这里需要将用到的命令进行排序 [root@ ...

  3. Linux0基础深度解析shell简介01

    一.shell简介 ------------     用户      |         终端  (相当于bash的接口)      |     shell(壳) bash 大多数Linux系统默认的 ...

  4. shell 脚本-01 变量、字符串、数组

    简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通 ...

  5. Linux——shell练习题01

    题目要求: 1.ping主机测试,查看主机是否存活: 2.判断一个用户是否存在: 3.判断当前内核主版本是否为3,且次版本是否大于10: 4.判断vsftpd软件包是否安装,如果没有则自动安装: 5. ...

  6. shell基础04 结构化命令

    几乎和别的编程语言思想一样,只是关键字写法稍有不同.总结主要包括如下几种:if-then,for,while 1. if-then 格式: if command    #根据command的状态码是否 ...

  7. shell脚本逻辑判断,文件目录属性判断,if,case用法

    shell脚本中的逻辑判断 1.if then fi [root@weixing01 shell]# cat if1.sh #!/bin/bash a=5 if [ $a -gt 3 ] thenec ...

  8. shell如何控制文件读写不同时_如何定时备份Mysql数据库数据?

    这是为小白定制的专属<Linux轻松上手>系列.涵盖了linux常用指令.shell脚本等核心内容,浅显易懂,配合实操案例快速上手.目标就是帮助大家轻松上手linux,少走弯路! 上一篇如 ...

  9. shell 编程基础

    1 创建shell脚本文件 要创建一个shell脚本文件,必须在第一行指定要使用的shell,其格式为: #! /bin/bash 接着加上该shell文件的注释,说明该脚本文件用来干什么,有谁创建, ...

最新文章

  1. linux下批量修改文件名精彩解答案例分享
  2. 笔记整理-信息系统开发基础-面向对象分析与设计-面向对象设计的基本任务
  3. 三十、电子商务分析与服务推荐的分析方法与过程
  4. 限制tomcat带宽_必看的Tomcat性能优化
  5. [jQuery] jQuery函数
  6. MySQL基础(三)表关系及数据的增删改查
  7. 教你如何用若依创建子模块详细教程
  8. php遍历文件夹下文件内容_php实现的遍历文件夹下所有文件,编辑删除
  9. fiddler 使用
  10. 基于python的猜大小游戏
  11. 论大数据仓库的事务处理之法
  12. xboxone硬盘坏的表现_移动硬盘打不开认不到以后的数据恢复所需要涉及到知识与恢复过程...
  13. K650c + Ubuntu15.04双显卡切换
  14. H3C 路由器中VLAN隔离
  15. 快手如何通过算法和算力支撑用户的增长
  16. android 微信webview,微信浏览器webview调试
  17. Docker:overlay2浅析
  18. yogabook安卓安装linux,Chromebook Linux支持将升级,它们先用上
  19. The Cook and the Chef: Musk’s Secret Sauce
  20. 剑指Offer——毕业生求职网站汇总(干货)

热门文章

  1. 如何下载完整的ie6sp1
  2. 《java入门第一季》之面向对象(static关键字)
  3. 浅谈阻塞/非阻塞、同步/异步——从linux read()系统调用出发
  4. 速卖通小伙伴们,关于欧盟VAT税改最全面解读,杭州海赢科技分享!
  5. WPF:鼠标拖曳、拖动控件
  6. 微信支付服务商模式签名错误小坑
  7. .NetCore搭建的文件服务有些文件不能下载
  8. 快速上手 Kotlin 开发系列之数据类和枚举
  9. 台式计算机清洁除尘内容,台式电脑cpu除尘的方法
  10. linux运行fuzzbunch,方程式0day ETERNALBLUE复现之Empire ampamp; Msfconsole下的she...