You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本正则匹配数字模式失败,轮值做饭逻辑异常求助

解决Bash脚本中浮点数正则匹配失败的问题

我明白你的问题了——当周数是18时,bc输出的是4.50000000000000000000,但你的脚本没匹配到Zack的规则,反而输出了"No cook matched!"。问题出在两个地方:Bash的[[匹配语法和正则表达式的写法,另外其实还有更简单可靠的方法不用处理浮点数,咱们一步步来解决:

问题根源分析

  1. 在Bash的[[ ... ]]结构里,用=做匹配时,默认是通配符(glob)匹配,不是正则表达式匹配。要启用正则匹配,得用=~运算符。
  2. 你的正则表达式写法也有问题:比如^[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:18:16