Shell退出状态的使用
每一条Shell命令,不管是Bash内置命令(例如cd、echo),还是外部的Linux命令(例如ls、awk),还是自定义的Shell函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这就是命令的退出状态(exitstatu)。
很多Linux命令其实就是一个C语言程序,熟悉C语言的读者都知道,main()函数的最后都有一个return0,如果程序想在中间退出,还可以使用exit0,这其实就是C语言程序的退出状态。当有其它程序调用这个程序时,就可以捕获这个退出状态。
if语句的判断条件,从本质上讲,判断的就是命令的退出状态。
按照惯例来说,退出状态为0表示“成功”;也就是说,程序执行完成并且没有遇到任何问题。除0以外的其它任何退出状态都为“失败”。
之所以说这是“惯例”而非“规定”,是因为也会有例外,比如diff命令用来比较两个文件的不同,对于“没有差别”的文件返回0,对于“找到差别”的文件返回1,对无效文件名返回2。
有编程经验的读者请注意,Shell的这个部分与你所熟悉的其它编程语言正好相反:在C语言、C++、Java、Python中,0表示“假”,其它值表示“真”。
在Shell中,有多种方式取得命令的退出状态,其中$?是最常见的一种。上节《Shellifelse》中使用了(())进行数学计算,我们不妨来看一下它的退出状态。请看下面的代码:
#!/bin/bash reada readb (($a==$b)); echo"退出状态:"$?
运行结果1:
26
26
退出状态:0运行结果2:
17
39
退出状态:1
退出状态和逻辑运算符的组合
Shellif语句的一个神奇之处是允许我们使用逻辑运算符将多个退出状态组合起来,这样就可以一次判断多个条件了。
Shell逻辑运算符
运算符 | 使用格式 | 说明 |
---|---|---|
&& | expression1&& expression2 | 逻辑与运算符,当 expression1和 expression2同时成立时,整个表达式才成立。 如果检测到expression1的退出状态为0,就不会再检测expression2了,因为不管expression2的退出状态是什么,整个表达式必然都是不成立的,检测了也是多此一举。 |
|| | expression1|| expression2 | 逻辑或运算符,expression1和 expression2两个表达式中只要有一个成立,整个表达式就成立。 如果检测到expression1的退出状态为1,就不会再检测expression2了,因为不管expression2的退出状态是什么,整个表达式必然都是成立的,检测了也是多此一举。 |
! | !expression | 逻辑非运算符,相当于“取反”的效果。如果expression成立,那么整个表达式就不成立;如果expression不成立,那么整个表达式就成立。 |
【实例】将用户输入的URL写入到文件中。
#!/bin/bash readfilename readurl iftest-w$filename&&test-n$url then echo$url>$filename echo"写入成功" else echo"写入失败" fi
在Shell脚本文件所在的目录新建一个文本文件并命名为urls.txt,然后运行Shell脚本,运行结果为:
urls.txt↙
http://jb51.net/shell/↙
写入成功
test是Shell内置命令,可以对文件或者字符串进行检测,其中,-w选项用来检测文件是否存在并且可写,-n选项用来检测字符串是否非空。下节《Shelltest》中将会详细讲解。
>表示重定向,默认情况下,echo向控制台输出,这里我们将输出结果重定向到文件。
到此这篇关于Shell退出状态的使用的文章就介绍到这了,更多相关Shell退出状态内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!