2017-04-06 78 views
0

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

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

回答

5

#获得的最后一个元素2装置的长度,以获得变量值的长度。对于普通变量,这意味着它的长度以字符为单位。 #是“数字”符号,因此您可以将其记为“变量中的事物数量”。

@*在数组索引中意味着使用整个数组而不是特定元素,而不是返回字符数,而是返回数组元素的数量。在许多情况下,*被用作通配符,所以这应该很容易记住。另外,$*[email protected]用于表示shell脚本的所有参数,所以与所有数组元素的并行应该是显而易见的。

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

+0

这是有帮助的 - 谢谢! –

1

在形式${#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 

它得到现在有趣,可以通过以可变参考的开始做

printf "%s\n" "${#myArray[4]}" 
2 
4

你应该记住。 :) #通常意味着号码。例如所述

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

不幸的是${parameter#word}${parameter##word}号码没有任何关系。 (它会从parameter开始的最短/最长word

而且还可以,# ....是评论;)