Bash获取数组长度失败:${#args}统计参数数量不符合预期
问题分析与解决
问题原因
你的脚本存在两个关键错误:
- 数组长度获取语法错误:
${#args}并不是获取数组总长度,而是获取数组第一个元素的字符长度。测试中第一个参数是a,长度为1,所以输出param count:1。 - 数组赋值方式错误:
args=(echo $@)会将所有位置参数拼接成一个字符串后再拆分,不仅效率低,还会在参数包含空格、通配符时引发错误拆分的问题。
修正后的脚本
#!/bin/bash args=("$@") # 直接将位置参数赋值给数组,保留每个参数的完整性 echo "param count: ${#args[@]}" # 使用${#args[@]}获取数组总长度 echo "p1,p2,p3,p4,p5: ${args[0]},${args[1]},${args[2]},${args[3]},${args[4]}"
执行效果
执行bash test1.sh a b c d e后,输出会变成:
param count: 5 p1,p2,p3,p4,p5: a,b,c,d,e
补充说明
$@代表所有位置参数,用双引号包裹"$@"时,每个参数会被当作独立的数组元素,即使参数包含空格也能正确保留。${#args[@]}和${#args[*]}都可以获取数组总长度,用于获取长度时效果一致。
内容的提问来源于stack exchange,提问作者Jack Ma
相关产品推荐
相关产品推荐

