【问题标题】:Length of array passed as an argument to a function作为参数传递给函数的数组长度
【发布时间】:2020-08-16 04:19:03
【问题描述】:

我需要将一个数组作为参数传递给一个函数(这很好),然后获取它的长度(我不让它工作)。

工作示例:

function foo {
 declare -a idn=("${!1}")
 echo "idn=${idn[@]}"
 n=${#idn[@]}
 echo "n=$n"
}

identifier=(a b c d e)
echo "len is ${#identifier[*]}"
echo foo
foo identifier[*]

输出是:

len is 5              #that is OK
foo
idn=a b c d e
n=1                   #should be 5

函数外的长度是可以的,但它不在函数内。

我正在使用 GNU bash,版本 4.3.42(1)-release (x86_64-suse-linux-gnu)

【问题讨论】:

    标签: arrays bash arguments


    【解决方案1】:

    您的原始脚本只需将最后一行更改为:

    foo "identifier[@]"
    

    【讨论】:

      【解决方案2】:

      使用 -nameref 变量,如下所示:

      #!/usr/bin/env bash
      
      foo ()
      {
        # If argument 1 is not an array, return an error
        [ "${!1@a}" = 'a' ] || return 2
      
        # Make idn a nameref variable referrencing the array name from argument 1
        declare -n idn="$1"
      
        echo 'idn:' "${idn[@]}"
        n=${#idn[@]}
        echo 'n:' "$n"
      }
      
      identifier=(a b c d e)
      echo "len is ${#identifier[*]}"
      echo foo
      foo identifier
      

      或者将数组元素作为值传递:

      #!/usr/bin/env bash
      
      foo ()
      {
         declare -a idn=("${@}")
      
         echo 'idn:' "${idn[@]}"
         n=${#idn[@]}
         echo 'n:' "$n"
      }
      
      identifier=(a b c d e)
      echo "len is ${#identifier[*]}"
      echo foo
      foo "${identifier[@]}"
      

      【讨论】:

        【解决方案3】:

        如果您想将数组abcde 的各个参数传递给您的函数,请使用foo "${identifier[@]}"。然后在函数中可以使用$#来获取参数个数。

        或者,如果您想将变量的名称传递给您的函数,您可以使用本地 nameref 变量 idn 是对identifier 数组的引用。

        foo() {
          echo "n=$#"
        }
        
        foo2() {
          local -n idn=$1
          echo "n=${#idn[@]}"
        }
        
        identifier=(a b c d e)
        echo "len is ${#identifier[*]}"
        foo "${identifier[@]}"
        foo2 identifier
        

        输出:

        len is 5
        n=5
        n=5
        

        【讨论】:

          猜你喜欢
          • 2013-07-11
          • 1970-01-01
          • 2012-12-07
          • 2013-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多