Linux shell脚本set -e原理(set -o errexit 命令出错退出)(|| true屏蔽前面子命令返回值)(用if判断即使命令返回值不为零也不会退出)

这篇具有很好参考价值的文章主要介绍了Linux shell脚本set -e原理(set -o errexit 命令出错退出)(|| true屏蔽前面子命令返回值)(用if判断即使命令返回值不为零也不会退出)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

set -e基本原理

set -e 是 Linux shell 中的一个选项,它的作用是在脚本执行过程中,一旦出现任何命令执行失败(返回非零的退出状态码),脚本就会立即退出。

具体原理如下:

  1. 当设置了set -e选项后,shell 会在每个命令执行后检查其退出状态码。
  2. 如果命令的退出状态码为非零,表示命令执行失败,shell 会立即退出脚本,并返回该非零状态码。
  3. 如果命令的退出状态码为零,表示命令执行成功,shell 会继续执行下一个命令。

这个选项的作用是帮助脚本在出现错误时能够及时停止执行,避免错误的结果被进一步处理或传递。在编写脚本时,可以根据需要选择是否使用set -e选项。

使用set -e,当一行命令中包含多个子命令时,即使某个子命令返回值不为0,但最终那一行命令的返回值为0,脚本也不会报错退出

当一行命令中包含多个子命令时,set -e选项只会检查整行命令的退出状态。如果整行命令的退出状态为非零,表示整行命令执行失败,shell会立即退出脚本

使用|| true屏蔽前面子命令的返回值

为了屏蔽掉前面子命令的错误,我们可以使用|| true||是逻辑或运算符,它的作用是在前一个命令执行失败时执行后面的命令。而true是一个命令,它总是返回真(即退出状态为0),所以无论前面子命令是否执行成功,|| true都会使整个逻辑表达式返回真,从而避免了set -e选项导致的脚本退出。

举个例子,假设有一行命令如下:

command1 || true

如果设置了 set -e,并且 command1 的返回值不为0,那么整个表达式的返回值为0,脚本不会退出。

因此,使用 || true 可以屏蔽某个子命令的返回值,即使设置了 set -e,子命令返回值不为0也不会导致脚本退出。

再举个真实一点的例子:

#!/bin/bash

set -e

echo "This line will be executed"

false

echo "This line will be executed"

运行结果:

set -e,linux,shell,linux,bash,运维

但是如果用|| true就能屏蔽前面子命令的返回值:

#!/bin/bash

set -e

echo "This line will be executed"

false || true

echo "This line will be executed"

运行结果:
set -e,linux,shell,linux,bash,运维

set -e命令的其他注意事项

除了上面提到的使用 set -e 的技巧外,还有一些其他的注意事项:

1. 使用 set -e 时,要注意在脚本中的每个地方都生效。如果在脚本的某个函数中使用了 set -e,那么只有在该函数被调用后才会生效,不调用不会生效。在函数中的set -e被调用后,出了函数外也会开始受影响。

例如:

 #!/bin/bash
 
 function foo() {
     set -e
     echo "Inside foo"
     # false  # 这个命令会执行失败
     echo "After false"
 }
 
 function bar() {
     echo "Inside bar"
     foo
     # false
     echo "After foo"
 }
 
 echo "Before bar"
 bar
 
 false
 echo "After bar"

结果为:

set -e,linux,shell,linux,bash,运维

2. 可以使用 set +e 来临时禁用 set -e 的效果。在某些情况下,可能需要在特定的代码块中暂时禁用 set -e,以便处理一些特殊情况。

3. 使用 set -e 时,要注意命令执行失败的处理。当命令执行失败时,脚本会立即退出,因此需要确保在脚本中适当处理失败的情况,例如使用条件语句或错误处理机制来处理错误。

用if语句来判断命令执行返回值,用if语句判断,命令返回值不为0也不会直接退出

if语句中,命令的退出状态会被用作条件判断。如果命令的退出状态为0(即命令执行成功),if语句的条件会被认为是真,执行then分支;如果命令的退出状态不为0(即命令执行失败),if语句的条件会被认为是假,执行else分支。

以下是一个示例,演示了在if语句中判断命令的退出状态:

#!/bin/bash

set -e

if false; then
    echo "This line will not be executed"
else
    echo "This line will be executed"
fi

echo "This line will be executed"

运行结果:

set -e,linux,shell,linux,bash,运维

在这个示例中,if false语句中的命令false会执行失败,但是由于命令的退出状态不为0,if语句的条件被认为是假,因此执行else分支,输出"This line will be executed"。然后,继续执行后续的echo语句,输出"This line will be executed"。文章来源地址https://www.toymoban.com/news/detail-834679.html

4. 在使用 set -e 时,要注意命令的返回值。有些命令的返回值可能不符合预期,例如某些命令即使执行失败也返回0。在这种情况下,set -e 可能无法正常工作,需要额外的处理来确保脚本的正确行为。

5. 要注意 set -e 只能检测命令的退出状态码,而不能检测其他类型的错误,例如语法错误、文件不存在等。因此,在编写脚本时,还需要考虑其他类型的错误处理机制。

到了这里,关于Linux shell脚本set -e原理(set -o errexit 命令出错退出)(|| true屏蔽前面子命令返回值)(用if判断即使命令返回值不为零也不会退出)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux shell脚本命令记录

    1、cut cut 命令可以从一个文本文件或者文本流中提取文本列。 egg:  参考:https://www.cnblogs.com/liuyansheng/p/6180332.html 2、identify identify命令主要用于获取一个或多个图像文件的格式和特性。 3、shell中#*,##*,#*,##*,%*,%%*的含义及用法    参考:shell中#*,##*,#*,##*,%*,%%*的

    2024年02月08日
    浏览(49)
  • 【Linux命令-shell】虚拟机中创建shell脚本、查看当前路径、执行脚本

    目录 一、创建shell脚本 二、查看当前的路径 三、执行脚本 一、创建shell脚本 shell脚本的特点 提前将可执行的命令语句写入一个文件中 顺序执行 解释器逐行解释代码 常见的脚本有:shell、python、PHP...... 注:用什么解释器就是什么脚本 编写shell脚本: 步骤: 1、新建文件 2、

    2024年02月05日
    浏览(68)
  • linux&shell日常脚本命令(1)

    Linux 清理make、configure生成的文件(灵感来自于quilt安装) Linux 清理make、configure生成的文件 == make clean #清除上一次make命令生成的文件== make distclean #清除上一次make以及configure命令生成的文件 然后再 shell脚本传参 shell如何传递外部参数给文件内部使用 shell脚本传参 sub.sh run.sh

    2024年01月21日
    浏览(47)
  • Linux的shell脚本常用命令

    使用shell脚本可以将所要执行的命令行进行汇总,统一执行,制作为脚本工具,简化重复性工作 1.1.1、启动命令 假设我们拥有一个halloWord.sh的脚本,通过cd 命令进入相对应的目录下 1.1.2、记录日志 将脚本执行的内容以及输出记录在log.txt文件中,同时也控制台显示器也要输出

    2024年02月13日
    浏览(44)
  • Linux 查询正在运行的shell脚本命令

    1.查看当前运行的所有进程。 ps -A 2.如果太多了找不到,看的眼花,可以加条件 grep是分组 查看正在运行的shell脚本的进程shell脚本就是 sh ps -ef |grep  sh 如图下面就是查询出来的所有sh脚本,看第三列就是脚本的进程UID,直接杀死UID就行    3.杀死进程UID kill  4491 如图 直接杀

    2024年02月12日
    浏览(50)
  • 【Linux】Shell脚本中获取命令运行的结果

    写shell脚本的时候,常需要将一个命令的运行结果做为参数传递给另外一个命令,除了我们熟知的管道 | 和args,我们也可以通过获取命令的运行结果。 执行结果: 来点复杂的应用: 再比如: 😉 运行结果: 把反引号``换成$()即可 反引号不支持嵌套,而 $ 支持嵌套。 举个例

    2024年02月11日
    浏览(39)
  • 【Linux命令行与Shell脚本编程】第十六章 Shell函数

    脚本函数基础 函数返回值 在函数中使用变量 数组变量和函数 函数递归 创建库 在命令行中使用函数 可以将shell脚本代码放入函数中封装起来,这样就能在脚本的任意位置多次使用. 函数是一个脚本代码块,可以并在脚本中的任何位置重用它。当需要在脚本中使用该代码块时

    2024年02月14日
    浏览(54)
  • shell:脚本执行失败就退出的3种方案

    简介:  在日常的自动化测试中,尤其shell脚本,在针对需要多个程序运行,shell脚本顺序执行过程可能会有中间环节会运行失败,抛出异常停止运行并报错,然而shell的其他下方语句仍然会继续往下执行,有时需要规避这类问题,使得出错后就退出后面的执行。 案例目录结构

    2024年02月11日
    浏览(36)
  • 【Linux命令行与Shell脚本编程】第十四章,呈现数据

    第十四章 呈现数据 1.1,标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.1.1,STDIN 标准输入 1.1.2,STDOUT 标准输出 1.1.3,STDERR 错误输出 1.2,重定向错误 1.2.1.只重定向错误 n 1.2.2.重定向错误消息和正常输出 2.1,临时重定向 2.2,永久重定向 exec 4

    2023年04月25日
    浏览(43)
  • linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令

    需求方通过sftp不定时的上传一批用户(SBXDS_ACC_M_任务ID_yyyymmddHHMMSS.csv),需要我们从这些用户中找出满足条件的用户。然后把这些结果用户通过文件的形式上传到ftp。 ip1能连接hive库环境,不能连接sftp。 ip2不能连接hive库环境,能连接sftp。 ip1和ip2是共享盘,能同时访问公共目录

    2024年02月19日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包