解释bash中${#arrayname[@]}语法用于获取数组长度的含义?

9

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

我的问题是:这只是我需要记忆的内容吗,还是这个语法可以分解成易懂的部分?比如,@符号在期望找到索引的位置代表什么意思?为什么要用#

4个回答

17
变量引用前面加上#表示获取变量值的长度。对于普通变量,这意味着其字符长度。#是"数"符号,因此可以记为表示“变量中的项目数量”。
在数组索引中使用@*表示使用整个数组而不是特定元素,并且返回的不是字符数,而是数组元素数目。*在许多上下文中用作通配符,所以这应该很容易记住。同时,$*$@用于表示shell脚本的所有参数,因此与所有数组元素的并行关系应该很明显。
不能仅编写${#arrayname},因为当您在没有下标的情况下使用数组变量时,它相当于数组的元素0。因此,${#arrayname}${#arrayname[0]}相同,它代表数组第一个元素的字符数。

8

请记住。 :) # 通常表示数字。例如:

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

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

还有,# ....注释 ;)


4

一般使用表单${#PARAMETER}返回参数值的字符数,而不是字节数。

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

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

  1. 对于单个元素,它报告元素的字符串长度(与每个“普通”参数一样)
  2. 对于大量下标 @*,它报告数组中集合元素的数量

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

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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接