当前位置:   article > 正文

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

set -e

文章目录

set -e基本原理

set -eLinux 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
  • 1

如果设置了 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"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果:

在这里插入图片描述

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

#!/bin/bash

set -e

echo "This line will be executed"

false || true

echo "This line will be executed"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果:
在这里插入图片描述

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

结果为:

在这里插入图片描述

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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:

在这里插入图片描述

在这个示例中,if false语句中的命令false会执行失败,但是由于命令的退出状态不为0,if语句的条件被认为是假,因此执行else分支,输出"This line will be executed"。然后,继续执行后续的echo语句,输出"This line will be executed"。

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/512458
推荐阅读
相关标签
  

闽ICP备14008679号