bash - 在 bash 中尝试逻辑比较
问题描述
我只是想弄清楚为什么以下返回错误:
echo $[ $(( 2100%4 )) == 0 ] --> returns '1'
我知道我可能遗漏了一些简单的东西。
解决方案
简而言之,“意义”不同于“价值”。
零退出状态意味着成功。非零退出状态意味着失败。
零值与“假”布尔状态相关联。非零值与“真”布尔状态相关联。
与[ ... ]
相同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 == 0
。0 == 0
因为 command求值的表达式test
为真,所以test
command 以0
退出状态退出,表示“成功”。请注意,这==
是一个 bash 扩展,=
它进行字符串比较,它0
按0
字典顺序进行比较。它不比较数字,并且与算术运算符不同。
还有 bash 扩展(( ... ))
语法。计算(( ... ))
算术表达式,如果算术结果等于“真”布尔状态(即它导致非零值),(( .. ))
则以零退出状态退出(意味着成功)。如果表达式的计算结果为 0,即。"false" 布尔状态,然后(( ... ))
以非零退出状态退出。注意区别。
这样你就可以:
if (( 2100%4 == 0 )); then something; fi
2100%4 == 0
等于,这1
是“真”布尔状态,表示((
以零退出状态退出,表示成功,表示if
将执行主体。
推荐阅读
- javascript - React-Hooks:在 ContextAPI 中未定义“警报”
- c++ - 双端队列的容量
- tensorflow - AttributeError:模块'tensorflow'没有在Pycharm中运行的属性'compat'
- azure - Azure:列出服务主体的权限
- postgresql - PostgreSQL 中的慢事务处理
- laravel - 我正在尝试使用 WhereAs 从两个带有 laravel 的表中获取记录
- python-3.x - Python - 在 ML 代码中。出现错误:IndexError:列表索引超出范围
- xml - XSl:空格
- ios - 使用 Carthage 安装 AudioKit Core
- java - 错误:无法使用 Java 和 MySQL 创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]