【问题标题】:Error in getting array length in bash after passing to function传递给函数后在 bash 中获取数组长度时出错
【发布时间】:2018-07-26 03:57:11
【问题描述】:

这种方法有什么问题我无法获得正确的数组长度值

#!/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

【问题讨论】:

  • 这有助于我识别上面脚本中的陷阱:askubuntu.com/questions/674333/…
  • $# 已经是$@ 的长度;你不需要先创建一个数组。
  • 是否有必要区分参数是否实际上是一个数组?例如foo 1 "a b" foobar - 它应该报告一个大小为 3 的数组,而不涉及任何数组吗?
  • 建议的副本只告诉你 OP 显然已经知道的事情。正确的副本会说“在任何地方都使用引号,除非你能解释为什么不这样做。”

标签: arrays bash shell


【解决方案1】:

val=$@ 更改为val=("${@}") 应该没问题。

unix.stackexchange 中的This answer 解释了原因:

您正在将输入扁平化为单个值。

你应该这样做

list=("${@}") 

保持数组和空格的潜力 论据。

如果你错过了 ",那么像 ./script.sh "a b" 2 3 4 这样的东西会 返回长度为 5,因为第一个参数将被拆分

【讨论】:

  • 这不区分输入 foo 1 2 3var=(1 2 3); foo ${var[@]} 并且 len 和 contains 也需要修复。
  • @Maroun 如果我必须将两个参数传递给函数,list=("${@}") 会将参数合并为一个,并将作为单个数组回显。如何通过这种方法分别获取每个参数。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多