Shell退出状态的使用

 更新时间:2021年03月01日 09:25:23   投稿:zx  
这篇文章主要介绍了Shell退出状态的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

每一条 Shell 命令,不管是 Bash 内置命令(例如 cd、echo),还是外部的 Linux 命令(例如 ls、awk),还是自定义的 Shell 函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这就是命令的退出状态(exit statu)。

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

if 语句的判断条件,从本质上讲,判断的就是命令的退出状态。

按照惯例来说,退出状态为 0 表示“成功”;也就是说,程序执行完成并且没有遇到任何问题。除 0 以外的其它任何退出状态都为“失败”。

之所以说这是“惯例”而非“规定”,是因为也会有例外,比如 diff 命令用来比较两个文件的不同,对于“没有差别”的文件返回 0,对于“找到差别”的文件返回 1,对无效文件名返回 2。

有编程经验的读者请注意,Shell 的这个部分与你所熟悉的其它编程语言正好相反:在C语言、C++、Java、Python 中,0 表示“假”,其它值表示“真”。

在 Shell 中,有多种方式取得命令的退出状态,其中 $? 是最常见的一种。上节《Shell if else》中使用了 (()) 进行数学计算,我们不妨来看一下它的退出状态。请看下面的代码:

#!/bin/bash
read a
read b
(( $a == $b ));
echo "退出状态:"$?

运行结果1:
26
26
退出状态:0

运行结果2:
17
39
退出状态:1

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

Shell if 语句的一个神奇之处是允许我们使用逻辑运算符将多个退出状态组合起来,这样就可以一次判断多个条件了。

Shell 逻辑运算符

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

如果检测到 expression1 的退出状态为 0,就不会再检测 expression2 了,因为不管 expression2 的退出状态是什么,整个表达式必然都是不成立的,检测了也是多此一举。
|| expression1 || expression2 逻辑或运算符,expression1 和 expression2 两个表达式中只要有一个成立,整个表达式就成立。

如果检测到 expression1 的退出状态为 1,就不会再检测 expression2 了,因为不管 expression2 的退出状态是什么,整个表达式必然都是成立的,检测了也是多此一举。
! !expression 逻辑非运算符,相当于“取反”的效果。如果 expression 成立,那么整个表达式就不成立;如果 expression 不成立,那么整个表达式就成立。

【实例】将用户输入的 URL 写入到文件中。

#!/bin/bash
read filename
read url
if test -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选项用来检测字符串是否非空。下节《Shell test》中将会详细讲解。

>表示重定向,默认情况下,echo 向控制台输出,这里我们将输出结果重定向到文件。

到此这篇关于Shell退出状态的使用的文章就介绍到这了,更多相关Shell退出状态内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux忘记root密码进入单用户模式切换运行级别切换用户

    Linux忘记root密码进入单用户模式切换运行级别切换用户

    这篇文章主要介绍了Linux忘记root密码进入单用户模式切换运行级别切换用户,需要的朋友可以参考下
    2019-08-08
  • Linux 中unzip解压时中文乱码的解决办法

    Linux 中unzip解压时中文乱码的解决办法

    这篇文章主要介绍了Linux 中unzip解压时中文乱码的解决办法的相关资料,这里提供两种解决办法,希望能通过本文帮助到大家,需要的朋友可以参考下
    2017-09-09
  • shell产生随机数七种方法的实现

    shell产生随机数七种方法的实现

    这篇文章主要介绍了shell产生随机数七种方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Shell 函数参数

    Shell 函数参数

    这篇文章主要为大家分享了Shell 函数参数,方便学习shell脚本的朋友
    2014-09-09
  • linux 下获取当前工作路径的实例

    linux 下获取当前工作路径的实例

    今天小编就为大家分享一篇linux 下获取当前工作路径的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Shell脚本模拟多线程功能分享

    Shell脚本模拟多线程功能分享

    这篇文章主要介绍了Shell脚本模拟多线程功能分享,本文直接给出实现代码,代码中有详细的注释,需要的朋友可以参考下
    2014-11-11
  • bash shell和dash shell的区别详解

    bash shell和dash shell的区别详解

    本文主要介绍了bash shell和dash shell的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • shell 数组 ${array[@]} ${array[*]}的使用及区别解析

    shell 数组 ${array[@]} ${array[*]}的使用及区别解析

    shell中用括号来表示数组,数组元素间使用空格隔开,这篇文章主要介绍了shell 数组 ${array[@]} ${array[*]}的使用及区别,需要的朋友可以参考下
    2023-06-06
  • 学习linux常用命令(推荐)

    学习linux常用命令(推荐)

    本文给大家分享小编日常整理的有关linux常用命令,对大家今后的工作学习非常有帮助,对linux常用命令知识感兴趣的朋友一起学习吧
    2016-11-11
  • shell脚本批量执行指定路径下sql脚本的实现

    shell脚本批量执行指定路径下sql脚本的实现

    本文主要介绍了shell脚本批量执行指定路径下sql脚本的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论