Bash在执行数值计算时退出

时间:2014-10-02 06:21:48

标签: bash shell sh

我正在尝试在我的bash脚本中执行以下逻辑

#!/bin/bash
set -x
# Copy merchant files
set -o pipefail -o errexit

a=0
b=0
c=$(expr $a + $b)
if [[ $(expr $c) -lt 10 ]]; then
  echo true
fi

这永远不会按预期打印。产生的结果是:

++ set -o pipefail -o errexit
++ a=0
++ b=0
+++ expr 0 + 0
++ c=0

当a和b都为0时,上述逻辑也不起作用,如果任何一个非零,则工作正常。如果我修改我的逻辑而不是计算c,直接使用expr,如果它工作正常并按预期打印为true,而不管a和b的值是什么

#!/bin/bash
set -x
# Copy merchant files
set -o pipefail -o errexit

a=0
b=0
if [[ $(expr $a + $b) -lt 10 ]]; then
  echo true
fi

有人可以向我解释第一段代码的错误。

1 个答案:

答案 0 :(得分:5)

如果算术表达式的计算结果为零,那么expr将返回非零退出状态(shell将其解释为错误)是错误的。这与set -o errexit无法立即兼容。

由于您使用的是Bash,因此简单的解决方法是根本不使用expr

c=$((a + b))
if [[ "$c" -lt 10 ]]; then
    echo true
fi

如果您因某些原因希望与expr呆在一起,那么惯常的习惯用法就是在|| true或某些变体中捕获您想要允许的错误。

c=$(expr "$a" + "$b") || true

当您将计算重构为if子句时,那些"某些变体",即errexit无法触发if条件部分的失败{1}}或while子句(显然;否则,在set -o errexit下编写带有条件的代码是不可能的。