以下内容源于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. MySQL 4.1/5.0/5.1/5.5各版本的主要区别
  2. Python常用网页字符串处理技巧
  3. 怎样查看rpm安装包的安装路径
  4. c#中一个简单的深拷贝方法
  5. 如何设置顶部和底部固定,中间填满
  6. vs如何显示arcgis 二次开发工具控件
  7. 显示2位小数 python3_自动化常用语言python,版本3和2有何变化?
  8. geoiplookup命令没有任何输出问题
  9. Conda 环境常用碎笔记
  10. pano2vr 制作交互热点模板时常显示文字
  11. 懒惰还是懦弱?你真的不行吗?
  12. 【2021软件创新实验室暑假集训】总结篇
  13. 设计模式学习(十):Singleton
  14. 计算机专业高数学科难度,大学里极其有难度的4个专业,挂科率很高,不是学霸学不明白...
  15. 论文阅读笔记《Dynamic Few-Shot Visual Learning without Forgetting》
  16. Hadoop 实战之分析专利引用数据集(三)
  17. 2022.02.16【读书笔记】|基于深度学习的生命科学 第2章 深度学习概论(下)
  18. 排序算法之简单插入排序法
  19. 短线必看庄家克星底顶侦探 同花顺发现大庄家幅图公式
  20. vim插入模式小技巧

热门文章

  1. html 表情符号选择,实用输入域表情符号选择器jQuery插件
  2. 1-骨骼 形体 修图技巧
  3. ROS学习笔记(八)—— moveit!概述
  4. 条形码识别Matlab版本
  5. SDNU 1102.小树林(水题)
  6. ajax传cookie,为什么jquery的.ajax()方法没有发送我的会话cookie?
  7. HTML5贪吃蛇代码
  8. Linux常用命令练习
  9. Java 三种循环的流程图画法总结(for,while,do-while循环)
  10. 队列和堆栈 --- 先进先出和先进后出