在bash中解释$ {#arrayname [@]}语法的数组长度?

时间:2017-04-06 20:22:11

标签: arrays bash syntax

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

我的问题是:这是我必须记住的东西,还是可以将这种语法分解为可理解的部分?例如,@符号表示人们期望找到索引的位置是什么?为什么#

4 个答案:

答案 0 :(得分:10)

变量引用开头的

#表示获取变量值的长度。对于普通变量,这意味着它的长度为字符。 #是"号码"签名,所以你可以记住这个含义"变量中的东西数量"。

数组索引中的

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

你不能只写${#arrayname},因为当你使用没有下标的数组变量时,它等同于数组的元素0。因此${#arrayname}${#arrayname[0]}相同,这是数组第一个元素中的字符数。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:1)

'@'与'*'的行为方式相同。这不是提供特定的索引,而是引用完整的东西。

'#'告诉bash你想要长度

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

答案 3 :(得分:1)

通常使用表单${#PARAMETER}会返回字符数 NOT 字节中参数值的长度。

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

但是对于数组,这种扩展类型有两个含义:

  1. 对于单个元素,它报告元素的字符串长度 (对于每个"正常"参数)
  2. 对于质量下标@*它 报告数组中的设置元素数
  3. 考虑一个关于数组的例子,

    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的长度
    printf "%s\n" "${#myArray[4]}"
    2