【发布时间】:2017-04-06 20:22:10
【问题描述】:
我知道在 bash 中可以通过 ${#arrayname[@]} 获取数组的长度。
我的问题是:这只是我必须记住的东西,还是可以将这种语法分解成可以理解的部分?例如,@ 符号是什么意思,人们期望在哪里找到索引?为什么是#?
【问题讨论】:
我知道在 bash 中可以通过 ${#arrayname[@]} 获取数组的长度。
我的问题是:这只是我必须记住的东西,还是可以将这种语法分解成可以理解的部分?例如,@ 符号是什么意思,人们期望在哪里找到索引?为什么是#?
【问题讨论】:
#在变量引用的开头表示获取变量值的长度。对于普通变量,这意味着它的字符长度。 # 是“数字”符号,所以你可以记住它的意思是“变量中事物的数量”。
数组索引中的@ 或* 表示使用整个数组,而不是特定元素,并且不返回字符数,而是返回数组元素的数量。 * 在许多情况下被用作通配符,所以这应该很容易记住。此外,$* 和 $@ 用于表示 shell 脚本的所有参数,因此与所有数组元素的并行应该是显而易见的。
您不能只写${#arrayname},因为当您使用不带下标的数组变量时,它相当于数组的元素0。所以${#arrayname}和${#arrayname[0]}一样,都是数组第一个元素的字符数。
【讨论】:
你应该记住。 :) # 通常表示数字。例如
$# - 是参数的数量${#str} - 字符串的长度 $str
${#arr[@]}" - 数组的长度(元素数量)arr
${#arr} - 数组第一个元素的长度(如上面的 str)不幸的是,${parameter#word} 或 ${parameter##word} 与 数字 无关。 (它从parameter 的开头删除最短/最长的word。
另外,# .... 是评论;)
【讨论】:
一般使用${#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的长度可以通过do获得
printf "%s\n" "${#myArray[4]}"
2
【讨论】:
“@”的作用与“*”相同。而不是提供特定索引,而是引用完整的内容。
'#' 告诉 bash 你想要长度
https://www.cyberciti.biz/faq/finding-bash-shell-array-length-elements/
【讨论】: