Dou*_*kem 24 scripting bash exit arithmetic
我有一个设置 -e 的 bash 脚本,因此脚本将在任何退出状态下退出!= 0。
我正在尝试执行一些分配给变量的基本 shell 算术,有时表达式等于 0,这会导致 let 或 expr 命令的退出状态为“1”。
下面是一个例子:
#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"
Run Code Online (Sandbox Code Playgroud)
输出是:
$ ./test_error.sh
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'
Run Code Online (Sandbox Code Playgroud)
我的问题是什么是惯用的 bash 脚本编写方式来允许脚本在实际退出错误而不是基本算术等于 0 时失败。我可以为所有这些表达式添加后缀:
A=`expr $C - $D` || true
Run Code Online (Sandbox Code Playgroud)
但这似乎很hacky。
Gil*_*il' 19
不要expr用于算术。它早已过时了:shell 现在内置了算术,带有$((…))构造 (POSIX)、let内置 (ksh/bash/zsh) 或((…))构造 (ksh/bash/zsh)。
let((…))如果最后一个计算的表达式为 0 ,则返回 1(失败状态代码)。为避免导致脚本在 下退出set -e,请安排最后一个表达式不返回 0,例如:
let "a = 2 - 2" 1
((a = 2 - 2, 1))
Run Code Online (Sandbox Code Playgroud)
或者,使用|| true习语:
((a = 2 - 2)) || true
Run Code Online (Sandbox Code Playgroud)
或者,在里面做你的算术,在$((…))外面做你的作业。赋值返回值中最后一个命令替换的状态,如果没有命令替换,则返回 0,因此您很安全。这具有在任何 POSIX shell(例如破折号)中工作的额外好处。
a=$((2 - 2))
Run Code Online (Sandbox Code Playgroud)