PHP带双重OR条件的do while循环停止逻辑异常求助
问题分析与解决方案
看起来你是把while循环的终止条件和继续条件搞反了,这是shell脚本里很容易踩的坑!
核心逻辑误区
while循环的运行规则是:只要条件为真,就持续执行循环体。你想要的是「当$sell > $buy 或者 $k < 0.5时终止循环」,反过来就是——只有当$sell ≤ $buy 并且 $k ≥ 0.5时,循环才继续跑。
错误示例(你可能写的代码)
如果你的循环是这么写的,那肯定会出问题:
# 错误:满足终止条件时反而继续循环 while [ $sell -gt $buy ] || [ $k -lt 0.5 ] do # 你的循环操作,比如更新sell、high、k的值 echo "当前sell=$sell, k=$k" done
这个条件的意思是:只要$sell大于$buy,或者$k小于0.5,就继续循环——完全和你的需求相反!
正确写法
1. 整数/整数等价比较的情况
如果$sell、$buy是整数,$k可以用整数等价表示(比如用百分比50代替0.5),可以直接用[]:
while [ $sell -le $buy ] && [ $k -ge 50 ] do # 你的循环逻辑 # 比如第一次迭代后k变成40(对应0.4),或者sell超过buy # 循环会自动终止 done
2. 浮点数比较的情况
如果$k是真正的浮点数(比如0.4、0.5),bash的[]不支持浮点数运算,得用bc工具来做比较:
# 用bc判断浮点数,返回1表示真,0表示假 while [ $sell -le $buy ] && [ $(echo "$k >= 0.5" | bc) -eq 1 ] do # 循环体操作 # 举个测试场景:第一次迭代后k=0.4 # $(echo "0.4 >=0.5" | bc) 会返回0,while条件不成立,循环终止 done
验证你的场景
假设第一次迭代后$k变成了0.4(小于0.5),那么$(echo "$k >=0.5" | bc)返回0,整个while的条件[ $sell -le $buy ] && [ 0 -eq 1 ]会变成假,循环直接停止,完全符合你的预期。
内容的提问来源于stack exchange,提问作者sineverba
相关产品推荐
相关产品推荐

