我正在尝试在我的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
有人可以向我解释第一段代码的错误。
答案 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
下编写带有条件的代码是不可能的。