首页 > 解决方案 > 在 bash 中尝试逻辑比较

问题描述

我只是想弄清楚为什么以下返回错误:

echo $[ $(( 2100%4 )) == 0 ] --> returns '1'

我知道我可能遗漏了一些简单的东西。

标签: bashlogical-operators

解决方案


简而言之,“意义”不同于“价值”。

零退出状态意味着成功。非零退出状态意味着失败。

零值与“假”布尔状态相关联。非零值与“真”布尔状态相关联。

[ ... ]相同test ...。如果里面的test表达式为假(如真假,非真),则命令以非零退出状态退出。如果里面的test表达式为真,则命令以零退出状态退出。

$[ ... ]是一种旧的、未记录的和不推荐使用的算术扩展形式$(( ... ))(还有expr ...你不应该使用的)。

仅当以零退出状态退出时才if expr; then body; fi执行该body部分,即。expr这里的意思是“成功”。

所以:

echo $[ $(( 2100%4 )) == 0 ] 

将打印1。将$(( 2100%4 ))进行算术运算并展开为0. 算术扩展与 C 语言一样工作。==算术运算的结果是1如果数字相等,那么0如果数字不相等。将$[ 0 == 0 ]进行算术运算并扩展为一个 number 1,因为这将是==operator 的结果。

而:

[ $(( 2100%4 )) == 0 ] 

执行[ 0 == 0 ],与 相同test 0 == 00 == 0因为 command求值的表达式test为真,所以testcommand 以0退出状态退出,表示“成功”。请注意,这==是一个 bash 扩展,=它进行字符串比较,它00字典顺序进行比较。它不比较数字,并且与算术运算符不同。

还有 bash 扩展(( ... ))语法。计算(( ... ))算术表达式,如果算术结果等于“真”布尔状态(即它导致非零值),(( .. ))则以零退出状态退出(意味着成功)。如果表达式的计算结果为 0,即。"false" 布尔状态,然后(( ... ))以非零退出状态退出。注意区别。

这样你就可以:

if (( 2100%4 == 0 )); then something; fi

2100%4 == 0等于,这1是“真”布尔状态,表示((以零退出状态退出,表示成功,表示if将执行主体。


推荐阅读