以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除。

一、退出状态

(1)不管是 Bash 内置命令,还是外部的 Linux 命令,还是自定义的 Shell 函数,当它运行结束或者退出时,都会返回一个比较小的整数值给调用它的程序,这个整数值就表示命令的退出状态。

很多 Linux 命令其实就是一个C语言程序,熟悉C语言的读者都知道,main() 函数的最后都有一个return 0,如果程序想在中间退出,还可以使用exit 0,这其实就是C语言程序的退出状态。当有其它程序调用这个程序时,就可以捕获这个退出状态。

(2)在 Shell 中,有多种方式取得命令的退出状态,其中 $?是最常见的一种。

xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bashread a
read b(( $a == $b ));echo "退出状态:"$?
xjh@ubuntu:~/iot/tmp$ ./test.sh
33
33
退出状态:0
xjh@ubuntu:~/iot/tmp$ ./test.sh
23
45
退出状态:1
xjh@ubuntu:~/iot/tmp$

(3)if 语句的判断条件,从本质上讲,判断的就是命令的退出状态。注意,Shell中退出状态为 0 表示“成功”、“真”,即程序执行完成并且没有遇到任何问题,除 0 以外的其它任何退出状态都为“失败”、“假”。注意,这正好与C语言的规定相反,在C语言中,0 表示“假”,其它值表示“真”。

如果shell中一个命令(比如判断大小)成立,则其返回值为0,而shell中的if也是命令返回值为0时才成立,这样一来,我们就可以只根据命令(比如大小关系)是否正确来判断if是否执行了,所谓“负负得正”,不用再绕弯子先去判断命令的返回值,然后再根据if只在返回值为0时才成立。比如下面代码中,直接看 $a是否等于$b即可。

xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bashread a
read bif (( $a == $b ))  # a=33,b=33时,由上面可知(( $a == $b ))退出的状态为0(表示成功、真) # 此时if根据退出的状态为真,then后面的内容得以执行# 或者直接看 $a是否等于$b即可。
thenecho "a和b相等"
fi
xjh@ubuntu:~/iot/tmp$ ./test.sh
33
33
a和b相等
xjh@ubuntu:~/iot/tmp$

二、退出状态和逻辑运算符的组合

(1)在if语句中,我们可以使用逻辑运算符将多个退出状态组合起来,一次判断多个条件。

Shell 逻辑运算符
运算符 使用格式 说明
&& if expression1 && expression2 逻辑与运算符,当 expression1 和 expression2 同时成立时,整个表达式才成立。

如果检测到 expression1 的退出状态为1(表示失败),就不会再检测 expression2 了,因为不管 expression2 的退出状态是什么,整个表达式必然都是不成立的,检测了也是多此一举。

|| if expression1 || expression2 逻辑或运算符,expression1 和 expression2 两个表达式中只要有一个成立,整个表达式就成立。

如果检测到 expression1 的退出状态为 0(表示成功),就不会再检测 expression2 了,因为不管 expression2 的退出状态是什么,整个表达式必然都是成立的,检测了也是多此一举。

! if !expression 逻辑非运算符,相当于“取反”的效果。如果 expression 成立,那么整个表达式就不成立;如果 expression 不成立,那么整个表达式就成立。

(2)举例:将用户输入的 URL 写入到文件中。下面代码中,test 是 Shell 内置命令,可以对文件或者字符串进行检测,其中,-w选项用来检测文件是否存在并且可写,-n选项用来检测字符串是否非空。>表示重定向,默认情况下,echo 向控制台输出,这里我们将输出结果重定向到文件。

xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bashread filename
read urlif test -w $filename && test -n $url
thenecho $url > $filenameecho "写入成功"
elseecho "写入失败"
fi
xjh@ubuntu:~/iot/tmp$ ./test.sh
test.txt
http://www.baidu.com.cn
写入失败
xjh@ubuntu:~/iot/tmp$ touch test.txt
xjh@ubuntu:~/iot/tmp$ ls
test1.sh  test2.sh  test.sh  test.txt
xjh@ubuntu:~/iot/tmp$ ./test.sh
test.txt
http://www.baidu.com.cn
写入成功
xjh@ubuntu:~/iot/tmp$
xjh@ubuntu:~/iot/tmp$ test -w test.txt
xjh@ubuntu:~/iot/tmp$ echo $?
0
xjh@ubuntu:~/iot/tmp$ test -w test.c
xjh@ubuntu:~/iot/tmp$ echo $?
1
xjh@ubuntu:~/iot/tmp$

Shell编程——退出状态(if语句判断某个命令的退出状态)相关推荐

  1. shell编程入门、shell编程的基础知识(变量、命令、运算)、shell编程的语句

    shell编程 示例1 ex1 文件内容如下: #!/bin/sh #This is to show what a example looks like. echo "My First Sh ...

  2. linux里返回状态命令行,Shell $?获取函数返回值或者上一个命令的退出状态

    $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1, ...

  3. Shell编程(逻辑判断、文件目录属性判断、if特殊用法、case判断)

    为什么80%的码农都做不了架构师?>>>    shell脚本中的逻辑判断 在shell脚本当中很多地方都会用到逻辑判断,判断某一个数值,判断某个目录或文件,然后针对判断的结果再做一 ...

  4. js全屏、退出全屏、判断是否处于全屏状态

    全屏 function showFullScreen(){lastFullScreenFlag=true;if (!document.fullscreenElement &&!docu ...

  5. shell脚本:使用if-then语句和test命令

    一.基本结构化命令if-then语句格式: bash shell的if语句会运行if后面的那个命令.如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行.如果该命令的退出状态 ...

  6. Shell编程—【05】Linux的find命令详解

    常用参数: -name 根据文件名查找 查找/etc目录下以conf结尾的文件 find /etc -name '*conf' 复制代码 -iname 根据文件名查找忽略大小写 查找当前目录文件名为a ...

  7. android studio 退出编译,Android studio用什么命令可以退出当前应用

    最佳答案 Android Studio 启动速度优化1.开启 gradle 单独的守护进程当 Android Studio 遇到错误的时候,往往会导致 Android Studio 挂掉,为了防止退出 ...

  8. linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态

    exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...

  9. Linux编程 23 shell编程(结构化条件判断 命令if -then , if-then ... elif-then ...else,if test)...

    一.概述 在上一篇里讲到了shell脚本,shell按照命令在脚本中出现的顺序依次进行处理,对于顺序操作已经足够了,但许多程序要求对shell脚本中的命令加入一些逻辑流程控制,这样的命令通常叫做 结构 ...

最新文章

  1. 简单的 docker SVG 动画(无聊之作)
  2. Lightgbm with Hyperopt
  3. PCA与LDA算法的解释,浅显易懂
  4. 是否是一个新的机会?
  5. boost::fibers模块实现single stream的测试程序
  6. 关于Entity Framework中的Attached报错相关解决方案的总结
  7. GC算法-分代垃圾回收
  8. Linux 下挂载新硬盘方法(转)
  9. Laravel 使用 scout 集成 elasticsearch 做全文搜索
  10. 编程范式--并发编程相关代码
  11. 【统计学笔记】正态概率图与Q-Q图
  12. 2023北京航空航天大学计算机考研信息汇总
  13. Python练习小工具——根据Exif的拍摄时间和设备名批量重命名照片
  14. UE4 单面模型法线翻转及碰撞问题
  15. WinDBG 技巧:列出模块(DLL/EXE)里面所有的符号(symbol)
  16. Apache Storm-2011
  17. OTG – Android USB Hos
  18. 19-Linux计划任务
  19. 民生银行京东三位大咖,手把手教你构建用户画像
  20. might和could的区别用法_综合能力_谁知道Can、Could、May和Might的区别__沪江网

热门文章

  1. Python爬取微信公众号历史文章进行数据分析,发现2017年运营总结,可以这样写!...
  2. c#使用WPD读取便携式设备信息一(枚举设备、连接设备及读取设备信息)
  3. 面向对象 -- 基础(A版)
  4. 鸟哥Linux私房菜:第六章笔记
  5. h264基本编码参数
  6. vivado编译报错:[IP_Flow 19-167] Failed to deliver one or more file(s).
  7. 前端开发入门到实战:JavaScript字符串转换数字
  8. 计算机专业当兵优势,本科应届毕业生直接“入伍”有什么优势?看完你就明白了...
  9. 电源模块中滤波电容的作用
  10. 建模常用的概念介绍1: WOE、IV