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

Bash斐波那契函数中变量赋值异常问题排查

斐波那契函数中数组赋值异常问题解析

我正在编写一个接收整数作为序列长度的斐波那契函数,代码如下:

function fib {
        local len=$1
        echo "len = $len"

        local arr=(0 1 1)

        if [[ $len -le 3 ]]
        then
                echo ${arr[@]:0:$len}
                let arr=${arr[@]:0:$len}
                echo $arr
        else
                while [[ ${#arr[*]} -lt $len ]]
                do
                        local sum=${arr[${#arr[*]}]}+${arr[${#arr[*]}-1]}
                        let arr+=$sum
                        echo "curren len = ${#arr[*]}"
                done
        fi

        echo "arr = $arr"
}

调用函数时得到如下结果:

👉👉👉 fib 2
len = 2
0 1
0
arr = 0
👉👉👉 fib 3
len = 3
0 1 1
0
arr = 0

暂时忽略效率问题,为何直接echo数组切片能得到正确序列,但使用let arr=赋值后却只能得到0?


问题原因解析

  • 核心问题出在let命令的用途和数组赋值语法的错误使用:
    1. let命令的本质:let是专门用于算术运算的命令,它会把右侧内容当作算术表达式解析,而非普通变量/数组赋值。当执行let arr=${arr[@]:0:$len}时,数组切片展开为空格分隔的字符串(如0 1或0 1 1),let会将其视为无效算术表达式,最终仅取第一个数值0赋值给arr,同时原本的数组变量会被覆盖成普通数值变量。
    2. 数组切片的正常输出:echo ${arr[@]:0:$len}能正常工作,是因为${arr[@]:0:$len}会正确展开数组切片的元素,以空格分隔后输出,这是数组切片的标准用法。
    3. 正确的数组赋值方式:如果要将数组切片赋值给原数组,需使用数组赋值语法:arr=("${arr[@]:0:$len}"),这样才能保留数组类型,同时得到正确的切片内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:43:33