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

Shell编写快乐素数检测代码运行报错问题排查求助

Shell快乐数脚本错误排查与修正

存在的问题

  • 变量赋值语法错误:Shell中变量赋值等号两侧不能有空格,rem = $0这类写法会被系统识别为调用rem命令而非赋值,正确写法为rem=$0
  • 函数参数取值错误:Shell函数的入参需要用$1、$2... 这类变量获取,$0是当前脚本的文件名,无法拿到函数传入的参数
  • 变量作用域问题:happy函数中未初始化result变量就直接在循环条件中调用,会导致空值报错,需要先把函数接收的参数赋值给内部计算变量
  • 函数返回值超限:Shell函数的return只能返回0-255范围的整数,用来返回计算得到的平方和会出现溢出异常,应该用echo输出结果,调用时通过$()捕获输出值
  • 条件判断语法错误:if [ $?==1 ]写法不符合Shell规范,数值比较的等于运算符为-eq,且运算符两侧必须留空格
  • 逻辑错误:
    1. 计算各位平方和时sum初始值应该为0,不是传入的参数本身
    2. 快乐数判断的终止条件应为结果等于1(是快乐数)或等于4(不是快乐数),原代码写的终止条件包含0不符合规则

修正后完整代码

#!/bin/bash
happy(){
    local num=$1
    local sum=0
    local rem=0
    while [ $num -gt 0 ]
    do
        rem=$((num%10))
        sum=$((sum + rem*rem))
        num=$((num/10))
    done
    echo $sum
}

# 若需要判断用户输入的单个数字,可删除下面的for循环,直接把result赋值为用户输入的num即可
echo "Enter a number"
read num

for (( i=1; i<101; i++ ))
do
    result=$i
    while [ $result -ne 1 ] && [ $result -ne 4 ]
    do
        result=$(happy $result)
    done
    if [ $result -eq 1 ]
    then
        echo "$i 是快乐数"
    else
        echo "$i 不是快乐数"
    fi
done

内容的提问来源于stack exchange,提问作者Nur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:03