我试图在我的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)
有人可以解释我第一段代码有什么问题.
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).
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |