【问题标题】:Explain ${#arrayname[@]} syntax for array length in bash?解释 bash 中数组长度的 ${#arrayname[@]} 语法?
【发布时间】:2017-04-06 20:22:10
【问题描述】:

我知道在 bash 中可以通过 ${#arrayname[@]} 获取数组的长度。

我的问题是:这只是我必须记住的东西,还是可以将这种语法分解成可以理解的部分?例如,@ 符号是什么意思,人们期望在哪里找到索引?为什么是#

【问题讨论】:

    标签: arrays bash syntax


    【解决方案1】:

    #在变量引用的开头表示获取变量值的长度。对于普通变量,这意味着它的字符长度。 # 是“数字”符号,所以你可以记住它的意思是“变量中事物的数量”。

    数组索引中的@* 表示使用整个数组,而不是特定元素,并且不返回字符数,而是返回数组元素的数量。 * 在许多情况下被用作通配符,所以这应该很容易记住。此外,$*$@ 用于表示 shell 脚本的所有参数,因此与所有数组元素的并行应该是显而易见的。

    您不能只写${#arrayname},因为当您使用不带下标的数组变量时,它相当于数组的元素0。所以${#arrayname}${#arrayname[0]}一样,都是数组第一个元素的字符数。

    【讨论】:

      【解决方案2】:

      你应该记住。 :) # 通常表示数字。例如

      • $# - 是参数的数量
      • ${#str} - 字符串的长度 $str
      • ${#arr[@]}" - 数组的长度(元素数量)arr
      • ${#arr} - 数组第一个元素的长度(如上面的 str

      不幸的是,${parameter#word}${parameter##word}数字 无关。 (它从parameter 的开头删除最短/最长的word

      另外,# .... 是评论;)

      【讨论】:

        【解决方案3】:

        一般使用${#PARAMETER} 形式返回参数值的字符数NOT字节的长度。

        myString="Hello StackOverflow!"
        printf "%s\n" "${#myString}"
        20
        

        但是对于数组来说,这种展开类型有两种含义:

        1. 对于单个元素,它会报告元素的字符串长度 (对于每个“正常”参数)
        2. 对于大众下标@9​​87654323@和*吧 报告数组中集合元素的数量

        考虑一个关于数组的例子,

        myArray=(1 2 3 4 15)
        printf "%s\n" "${myArray[@]}"    # <-- Gives me list of elements 
        1
        2
        3
        4
        15
        printf "%s\n" "${#myArray[@]}"   # <-- Gives me number of elements
        5
        

        现在有意思了,最后一个元素2的长度可以通过do获得

        printf "%s\n" "${#myArray[4]}"
        2
        

        【讨论】:

          【解决方案4】:

          “@”的作用与“*”相同。而不是提供特定索引,而是引用完整的内容。

          '#' 告诉 bash 你想要长度

          https://www.cyberciti.biz/faq/finding-bash-shell-array-length-elements/

          【讨论】:

            猜你喜欢
            • 2018-10-15
            • 1970-01-01
            • 1970-01-01
            • 2016-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-18
            • 2015-07-21
            相关资源
            最近更新 更多