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

Bash中数组传递至函数后无法获取正确长度的问题

问题分析与解决方案

这个问题的核心是你没有正确地在函数中接收数组参数,导致原本的数组被转换成了单个字符串变量,自然无法获取正确的数组长度。

具体问题出在哪?

  1. 当你调用foo ${var[@]}时,数组var会被展开成三个独立的位置参数:1、2、3,这一步其实是没问题的。
  2. 但在函数里执行val=$@时,你把所有位置参数拼接成了一个单一的字符串(1 2 3)赋值给了val——val此时是普通字符串变量,不是数组。
  3. 当你用${#val[@]}时,Bash会把非数组变量当成只有一个元素的数组来处理,所以返回的长度是1,而不是你期望的3。

正确的实现方式

要在函数中正确接收数组,你需要把位置参数重新打包成数组,注意一定要用双引号包裹$@,否则会丢失参数中的空格(如果有的话)。修改后的脚本如下:

#!/bin/bash
foo(){
 # 将位置参数转换为数组,双引号必须加
 val=("$@")
 len=${#val[@]}
 echo "Array contains: " "${val[@]}"
 echo "Array length is: " $len
}
var=(1 2 3)
# 调用函数时用双引号包裹数组展开,确保每个元素作为独立参数传递
foo "${var[@]}"

执行结果

Array contains:  1 2 3
Array length is:  3

额外小技巧

如果你不需要在函数里保存数组副本,其实可以直接用$@来操作,比如:

foo(){
 echo "Array contains: " "$@"
 echo "Array length is: " $#
}

这里$#直接返回位置参数的个数,也就是数组的长度,更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:46:37