Bash脚本正则匹配数字模式失败,轮值做饭逻辑异常求助
解决Bash脚本中浮点数正则匹配失败的问题
我明白你的问题了——当周数是18时,bc输出的是4.50000000000000000000,但你的脚本没匹配到Zack的规则,反而输出了"No cook matched!"。问题出在两个地方:Bash的[[匹配语法和正则表达式的写法,另外其实还有更简单可靠的方法不用处理浮点数,咱们一步步来解决:
问题根源分析
- 在Bash的
[[ ... ]]结构里,用=做匹配时,默认是通配符(glob)匹配,不是正则表达式匹配。要启用正则匹配,得用=~运算符。 - 你的正则表达式写法也有问题:比如
^[0-9]*\.50*$,这里的0*只能匹配小数点后紧跟的0,但bc输出的是一堆连续的0,而且你没正确使用正则匹配的语法规则。
修正正则匹配的版本
把条件判断里的=改成=~,并调整正则表达式,让它能匹配任意数量的尾随0:
#!/bin/bash # Script to check whose turn it is to cook week=$(date +%W) echo "Current week of the year is $week" teamsize=4 counter=$(echo "$week/$teamsize" | bc -l) echo "Current week's counter is $counter" if [[ $counter =~ ^[0-9]+\.0*$ ]]; then echo "Sandra's turn" elif [[ $counter =~ ^[0-9]+\.250*$ ]]; then echo "Christina's turn" elif [[ $counter =~ ^[0-9]+\.50*$ ]]; then echo "Zack's turn" elif [[ $counter =~ ^[0-9]+\.750*$ ]]; then echo "Peter's turn" else echo "No cook matched!" fi
更可靠的方案:避免浮点数,用整数取模
其实处理这种循环分配的问题,完全不需要用浮点数计算,直接用整数取模运算更高效也更不容易出错——因为浮点数可能会有精度问题(比如某些周数计算后可能出现类似4.499999999999999而不是4.5的情况)。
修改后的脚本如下:
#!/bin/bash # Script to check whose turn it is to cook week=$(date +%W) echo "Current week of the year is $week" teamsize=4 # 计算周数对4取模的结果 remainder=$((week % teamsize)) case $remainder in 0) echo "Sandra's turn" ;; # 周数是4的倍数(余数0) 1) echo "Christina's turn" ;; # 余数1 → 1/4=0.25 2) echo "Zack's turn" ;; # 余数2 → 2/4=0.5 3) echo "Peter's turn" ;; # 余数3 → 3/4=0.75 esac
这个版本逻辑更清晰,而且完全避开了浮点数的正则匹配问题,测试周数18的话,18%4=2,会直接输出"Zack's turn",完美解决你的问题。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

