Bash中数组传递至函数后无法获取正确长度的问题
问题分析与解决方案
这个问题的核心是你没有正确地在函数中接收数组参数,导致原本的数组被转换成了单个字符串变量,自然无法获取正确的数组长度。
具体问题出在哪?
- 当你调用
foo ${var[@]}时,数组var会被展开成三个独立的位置参数:1、2、3,这一步其实是没问题的。 - 但在函数里执行
val=$@时,你把所有位置参数拼接成了一个单一的字符串(1 2 3)赋值给了val——val此时是普通字符串变量,不是数组。 - 当你用
${#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
相关产品推荐
相关产品推荐

