求助:Bash FizzBuzz脚本逻辑错误排查,需用算术替换与指定运算符
Bash脚本FizzBuzz的错误分析与修正
先给你梳理脚本里的核心问题,再附上修正后的版本:
错误点整理
- 算术运算语法错误:Bash里做取模这类算术运算必须用
$((...))算术替换语法,你直接写$D % 3 == 0不会生效,不管是[ ]还是[[ ]]里,都得把算术判断放进$(( ))中。 - 条件判断顺序错误:同时是3和5倍数的判断(输出FizzBuzz的情况)必须放在最前面,不然前面的if/elif会先匹配到3或5的单一倍数条件,这个分支永远不会被触发。
- 语法结构混乱:第三个
elif没有写then和对应的执行语句;脚本里没有循环(比如for/while),却多了一个done;最后单独的echo "FizzBuzz"会无视条件强制执行,导致结果混乱。 - 数值判断符号错误:在
[ ]里的数值相等判断要用-eq而非==,[[ ]]里虽支持==,但结合算术运算时,用$(( ... == 0 ))的写法更统一规范。
修正后的脚本
写法一(用最小公倍数简化判断)
#!/bin/bash D=5 if [[ $((D % 15)) -eq 0 ]]; then # 15是3和5的最小公倍数,一次判断更高效 echo "FizzBuzz" elif [[ $((D % 3)) -eq 0 ]]; then echo "Fizz" elif [[ $((D % 5)) -eq 0 ]]; then echo "Buzz" fi
写法二(严格使用&&运算符)
#!/bin/bash D=5 if [[ $((D % 3)) -eq 0 && $((D % 5)) -eq 0 ]]; then echo "FizzBuzz" elif [[ $((D % 3)) -eq 0 ]]; then echo "Fizz" elif [[ $((D % 5)) -eq 0 ]]; then echo "Buzz" fi
补充说明
如果需要循环处理多个数字(比如1到100),只需套上循环结构即可,示例:
#!/bin/bash for D in {1..100}; do if [[ $((D % 15)) -eq 0 ]]; then echo "FizzBuzz" elif [[ $((D % 3)) -eq 0 ]]; then echo "Fizz" elif [[ $((D % 5)) -eq 0 ]]; then echo "Buzz" else echo $D # 非3/5倍数时输出原数字 fi done
内容的提问来源于stack exchange,提问作者Gabzxx_23
相关产品推荐
相关产品推荐

