Shell编程——退出状态(if语句判断某个命令的退出状态)
以下内容源于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语句中,我们可以使用逻辑运算符将多个退出状态组合起来,一次判断多个条件。
运算符 | 使用格式 | 说明 |
---|---|---|
&& | 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语句判断某个命令的退出状态)相关推荐
- shell编程入门、shell编程的基础知识(变量、命令、运算)、shell编程的语句
shell编程 示例1 ex1 文件内容如下: #!/bin/sh #This is to show what a example looks like. echo "My First Sh ...
- linux里返回状态命令行,Shell $?获取函数返回值或者上一个命令的退出状态
$? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1, ...
- Shell编程(逻辑判断、文件目录属性判断、if特殊用法、case判断)
为什么80%的码农都做不了架构师?>>> shell脚本中的逻辑判断 在shell脚本当中很多地方都会用到逻辑判断,判断某一个数值,判断某个目录或文件,然后针对判断的结果再做一 ...
- js全屏、退出全屏、判断是否处于全屏状态
全屏 function showFullScreen(){lastFullScreenFlag=true;if (!document.fullscreenElement &&!docu ...
- shell脚本:使用if-then语句和test命令
一.基本结构化命令if-then语句格式: bash shell的if语句会运行if后面的那个命令.如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行.如果该命令的退出状态 ...
- Shell编程—【05】Linux的find命令详解
常用参数: -name 根据文件名查找 查找/etc目录下以conf结尾的文件 find /etc -name '*conf' 复制代码 -iname 根据文件名查找忽略大小写 查找当前目录文件名为a ...
- android studio 退出编译,Android studio用什么命令可以退出当前应用
最佳答案 Android Studio 启动速度优化1.开启 gradle 单独的守护进程当 Android Studio 遇到错误的时候,往往会导致 Android Studio 挂掉,为了防止退出 ...
- linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态
exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...
- Linux编程 23 shell编程(结构化条件判断 命令if -then , if-then ... elif-then ...else,if test)...
一.概述 在上一篇里讲到了shell脚本,shell按照命令在脚本中出现的顺序依次进行处理,对于顺序操作已经足够了,但许多程序要求对shell脚本中的命令加入一些逻辑流程控制,这样的命令通常叫做 结构 ...
最新文章
- MySQL 4.1/5.0/5.1/5.5各版本的主要区别
- Python常用网页字符串处理技巧
- 怎样查看rpm安装包的安装路径
- c#中一个简单的深拷贝方法
- 如何设置顶部和底部固定,中间填满
- vs如何显示arcgis 二次开发工具控件
- 显示2位小数 python3_自动化常用语言python,版本3和2有何变化?
- geoiplookup命令没有任何输出问题
- Conda 环境常用碎笔记
- pano2vr 制作交互热点模板时常显示文字
- 懒惰还是懦弱?你真的不行吗?
- 【2021软件创新实验室暑假集训】总结篇
- 设计模式学习(十):Singleton
- 计算机专业高数学科难度,大学里极其有难度的4个专业,挂科率很高,不是学霸学不明白...
- 论文阅读笔记《Dynamic Few-Shot Visual Learning without Forgetting》
- Hadoop 实战之分析专利引用数据集(三)
- 2022.02.16【读书笔记】|基于深度学习的生命科学 第2章 深度学习概论(下)
- 排序算法之简单插入排序法
- 短线必看庄家克星底顶侦探 同花顺发现大庄家幅图公式
- vim插入模式小技巧