Arrays 传递给函数后在bash中获取数组长度时出错
这种方法有什么问题?我无法获得正确的数组长度值Arrays 传递给函数后在bash中获取数组长度时出错,arrays,bash,shell,Arrays,Bash,Shell,这种方法有什么问题?我无法获得正确的数组长度值 #!/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: 1 将val=$@更改为val=(“${}”),您应该会没事的 在
#!/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: 1
将
val=$@
更改为val=(“${}”)
,您应该会没事的
在unix.stackexchange中解释了原因:
您正在将输入展平为单个值
你应该这样做
list=("${@}")
要维护数组和中空格的潜力,请执行以下操作:
争论
如果您漏掉了“密码”,那么类似于/script.sh的“AB”2 3 4
就会出现
返回长度5,因为第一个参数将被拆分
这有助于我识别上面脚本中的gotchas:
$#
已经是$@
的长度;您不需要先创建数组。可能的重复项等。是否需要区分参数是否实际上是数组?例如foo 1“a b“foobar
-它是否应该报告一个大小为3的数组,而不涉及任何数组?建议的副本只告诉您OP显然已经知道的事情。正确的副本会说“在任何地方都使用引号,除非你能解释为什么不使用。”这并不能区分输入foo123
和var=(1233);foo${var[@]}
以及len和contains也需要修复。@Maroun如果我必须向函数传递两个参数,list=(“${}”)
将把参数合并为一个,并作为单个数组进行回显。如何通过这种方法分别获取每个参数。