Bash在执行数值计算时退出

Kun*_*alC 1 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
Run Code Online (Sandbox Code Playgroud)

这从未按预期打印.产生的输出是:

++ set -o pipefail -o errexit
++ a=0
++ b=0
+++ expr 0 + 0
++ c=0
Run Code Online (Sandbox Code Playgroud)

当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
Run Code Online (Sandbox Code Playgroud)

有人可以解释我第一段代码有什么问题.

tri*_*eee 5

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

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

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

如果您expr因某些原因希望留下来,习惯用语就是捕获您想要允许的错误|| true或某些变体.

c=$(expr "$a" + "$b") || true
Run Code Online (Sandbox Code Playgroud)

当你将计算重构为if子句时,那就是"某种变体",即errexit不能触发ifor while子句的条件部分的失败(显然;否则,编写带条件的代码是不可能的set -o errexit).