我知道在bash中可以通过${#arrayname[@]}
来获取数组的长度。
我的问题是:这只是我需要记忆的内容吗,还是这个语法可以分解成易懂的部分?比如,@
符号在期望找到索引的位置代表什么意思?为什么要用#
?
#
表示获取变量值的长度。对于普通变量,这意味着其字符长度。#
是"数"符号,因此可以记为表示“变量中的项目数量”。@
或*
表示使用整个数组而不是特定元素,并且返回的不是字符数,而是数组元素数目。*
在许多上下文中用作通配符,所以这应该很容易记住。同时,$*
和$@
用于表示shell脚本的所有参数,因此与所有数组元素的并行关系应该很明显。${#arrayname}
,因为当您在没有下标的情况下使用数组变量时,它相当于数组的元素0
。因此,${#arrayname}
与${#arrayname[0]}
相同,它代表数组第一个元素的字符数。请记住。 :) #
通常表示数字。例如:
$#
- 参数个数的数量${#str}
- 字符串$str
的长度${#arr[@]}
- 数组arr
的长度(元素数量)${#arr}
- 数组的第一个元素的长度(就像上面的 str
一样)不幸的是,${parameter#word}
或 ${parameter##word}
与数字无关(它从参数开头移除最短/最长的word
)。
还有,# ....
是注释 ;)
一般使用表单${#PARAMETER}
返回参数值的字符数,而不是字节数。
myString="Hello StackOverflow!"
printf "%s\n" "${#myString}"
20
但对于数组来说,这种扩展类型有两个含义:
@
和 *
,它报告数组中集合元素的数量考虑一个关于数组的例子,
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
'@' 的作用与 '*' 相同。它不需要提供特定的索引,而是引用整个内容。
'#' 告诉 bash 你想要获取长度。
https://www.cyberciti.biz/faq/finding-bash-shell-array-length-elements/