人被思维定势所束缚,一旦挣脱这种束缚,则境界突破矣!
数组是最简单的数据结构,不被人所重视,这就是一个非常危险的思维定势,实际上,数组是最伟大的数据结构,没有之一。
所有语言的数组,都个与众不同的语法规则,C/C++也好,Java也好,Python也好,Shell也好,每门开发语言都有数组,而且语法规范各异。
当我把这些语言的数组知识都汇总到一起的时候,我发现数组里面的学问真深啊。这就是我称之为伟大的原因。
数组,摇身一变就是哈希,数组和哈希是一脉相承,数组和哈希能撑起数据结构这门学科的半边天。树,如果分叉太多就退化成数组。可见数组的影响有多大。所以,称之为伟大,一点都过分。
数组是非常快的,可谓是世界第一快。因为数组是顺序存储,在内存中是一个整块。数组元素$data_i$的定位分为两步:
第一步,计算下标i * 数组元素大小求出偏移地址;
第二步,数组首地址+偏移地址就是元素$data_i$的地址。
任何数据的定位和查找只需两步,大道化简,简到极致,天下武功,无坚不破,唯快不破,所以数组才是最伟大的数据结构。
在shell语言中,数组的语法规范虽然简单但是绝不肤浅。
数组分为静态数组和动态数组。数组的长度必须为常量,数组无法扩展,这样的数组为静态数组,反之为动态数组。
在shell里面的数组属于动态数组,可以自由的扩容。例如:
[root@host ~]# num=(1 2 3 4)
[root@host ~]# num[4]=5
[root@host ~]# echo ${num[@]}
[root@host ~]# 1 2 3 4 5
数组的本质就是容器,大凡容器必分读操作和写操作,也可视为读容器和写容器。
数组的写操作非常简单,如上所示。下面重点说一下数组的读操作。
如何去读数组元素呢?其格式是:${数组名[下标]},例如:
value=${array_name[n]},
与普通变量相同的地方是${}语法,之处是新增了方括号[]。
另外,使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
容器除了读操作和写操作以外,还有一个非常重要的属性:容量,也就是数组元素的个数。
获取数组长度的方法与获取字符串长度的方法相同,例如:
取得数组元素的个数
length=${#array_name[@]}
或者
length=${#array_name[*]}
取得数组单个元素的长度
n_length=${#array_name[n]}
需要注意的是:但凡与长度相关的操作,常用会用到#操作符,或者说${#}运算符。关于$和#区别,可以大书特书,请见下文内容:字符的尊卑之别。
人分三六九等,地分东南西北,虽然众生皆平等,但是尊卑仍然有别。汉语习惯是以右为尊,成语“无出其右”,将右视为尊,将左视为卑。放眼印度,尊卑更加严重,其种姓制度举世皆知。
人类的文字和符号的演化进程,总有先后之序,映射到shell世界,亦充斥着尊卑之说。虽然#和$是对孪生兄弟,都是命令提示符,但是#表示root用户,内含尊贵之意,$表示非root用户,暗含卑微之义。
延伸到更广阔的天地,这种差别同样明显。空间分为有序和无序之别,犹如列表和集合。在用法上,#常用于表示序数,例如楼房号等。后来,我查阅百科发现,跟我的猜想类似:在unicode编码中建议称#为number sign,因为它常用于表示序数。
获取字符串变量,只需${var}足矣,但是要想获取字符串长度,带有量的内涵,则需要#加持,即为${#var},如下所示:
website=shelltalk
echo ${#website}
字符串是字符的数组构成,推而广之,则${#var}也适用于获取数组的长度,即为${#var[@]}。
另外,传递给脚本或函数的参数,隐含着数组之意,所以$#用于表示传递给脚本或函数的参数个数。与$#对应的是$$,而$$表示为当前shell进程ID。
备注:在CSS样式表中,ID选择器,以#号开头,只能出现一次;类选择法,以点开头,可以多次。
评论专区
评论加载中...登录后即可发表评论