bash set -e 不适用于 if 语句调用函数

时间:2021-05-28 02:54:09

标签: bash

我已经在 bash 版本 4.1.2 和 4.4.2.0 上进行了测试。 在下面的代码中,最后一个 i 值将为 4。 为什么在'if'语句中调用f4()时'false'命令没有停止?

#!/bin/bash
set -ex

i=0
f4() {
  i=$((i+1))
  echo "in f4 before false, i=$i"
  false
  i=$((i+2))
  echo "in f4 after false, i=$i"
}
if f4 ; then
  echo "f4 pass, i=$i"
fi
f4

这个脚本的输出

+ i=0
+ f4
+ i=1
+ echo 'in f4 before false, i=1'
in f4 before false, i=1
+ false
+ i=3
+ echo 'in f4 after false, i=3'
in f4 after false, i=3
+ echo 'f4 pass, i=3'
f4 pass, i=3
+ f4
+ i=4
+ echo 'in f4 before false, i=4'
in f4 before false, i=4
+ false

我期待的是

+ i=0
+ f4
+ i=1
+ echo 'in f4 before false, i=1'
in f4 before false, i=1
+ false
+ f4
+ i=2
+ echo 'in f4 before false, i=2'
in f4 before false, i=2
+ false

因此,这种行为意味着如果我们编写一个函数,'set -e' 可能会通过不同的方法调用该函数来改变其行为。

0 个答案:

没有答案