我知道可以通过执行${#arrayname[@]}
来获取bash中数组的长度。
我的问题是:这是我必须记住的东西,还是可以将这种语法分解为可理解的部分?例如,@
符号表示人们期望找到索引的位置是什么?为什么#
?
答案 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
但是对于数组,这种扩展类型有两个含义:
@
和*
它
报告数组中的设置元素数考虑一个关于数组的例子,
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