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

