我正在bash中进行简单的计算,我注意到如果计算结果为零,使用expr
的bash计算会返回 1 。
user@machine:~$ expr 42 - 40 ; echo $?
2
0
user@machine:~$ expr 42 - 84 ; echo $?
-42
0
user@machine:~$ expr 42 - 42 ; echo $?
0
1
为什么bash这样做? 1 的返回值是否表示程序失败?这种行为不违反良好做法吗?
我在使用set -e
的脚本运行中进行了一些计算。
考虑1的返回值的最佳方法是什么?
我能做到
expr $var1 - $var2 || true
但是这也会忽略除 1 之外的其他退出代码。
答案 0 :(得分:1)
这只是整数(如布尔值,0 = False,1 = True)到shell退出代码(0 =成功,> 0 =失败)的映射。请注意"失败"并不一定意味着"程序遇到错误和/或崩溃"。其他程序做类似的事情:
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<form class="form">
<input id="check_1" type="checkbox"/><label class="fa" for="check_1"></label>
<input id="check_2" type="checkbox"/><label class="fa" for="check_2"></label>
<input id="check_3" type="checkbox"/><label class="fa" for="check_3"></label>
</form>
在C中,您可以直接使用算术表达式的结果作为* `grep` exits with 0 if a match is made, 1 if no match is made.
* `test` exits 0 if its condition is true, 1 if its condition is false.
或if
语句的条件。
在shell中,这样的语句测试命令的退出代码,将成功视为类似于true,将失败视为类似于false。从这个意义上说,while
是expr ...
的缩写。
在典型的语言中,您可以编写类似
的内容test ... -ne 0
# Python
n = 10
while n - 3: # short for n > 3
...
执行算术运算,因此退出状态允许相同。
expr
请注意,通过检查n=10
while expr "$n" - 3; do
...
done
的退出状态是否大于1,您仍然可以检测实际错误,而不是布尔错误。
expr