✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

数组入门

创建时间:2022-04-17 更新时间:2022-04-17 阅读次数:1249 次

1、数组是最伟大的数据结构,没有之一。

人被思维定势所束缚,一旦挣脱这种束缚,则境界突破矣!

数组是最简单的数据结构,不被人所重视,这就是一个非常危险的思维定势,实际上,数组是最伟大的数据结构,没有之一。

所有语言的数组,都个与众不同的语法规则,C/C++也好,Java也好,Python也好,Shell也好,每门开发语言都有数组,而且语法规范各异。

当我把这些语言的数组知识都汇总到一起的时候,我发现数组里面的学问真深啊。这就是我称之为伟大的原因。

数组,摇身一变就是哈希,数组和哈希是一脉相承,数组和哈希能撑起数据结构这门学科的半边天。树,如果分叉太多就退化成数组。可见数组的影响有多大。所以,称之为伟大,一点都过分。

数组是非常快的,可谓是世界第一快。因为数组是顺序存储,在内存中是一个整块。数组元素$data_i$的定位分为两步:

第一步,计算下标i * 数组元素大小求出偏移地址;

第二步,数组首地址+偏移地址就是元素$data_i$的地址。

任何数据的定位和查找只需两步,大道化简,简到极致,天下武功,无坚不破,唯快不破,所以数组才是最伟大的数据结构。

2、数组的写操作

在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

数组的本质就是容器,大凡容器必分读操作和写操作,也可视为读容器和写容器。

3、数组的读操作

数组的写操作非常简单,如上所示。下面重点说一下数组的读操作。

如何去读数组元素呢?其格式是:${数组名[下标]},例如:

value=${array_name[n]},

与普通变量相同的地方是${}语法,之处是新增了方括号[]

另外,使用 @ 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

4、数组的容量计算

容器除了读操作和写操作以外,还有一个非常重要的属性:容量,也就是数组元素的个数。

获取数组长度的方法与获取字符串长度的方法相同,例如:

取得数组元素的个数

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选择器,以#号开头,只能出现一次;类选择法,以点开头,可以多次。

本教程共16节,当前为第7节!
本教程最新修订时间为:2026-08-21 21:27:37

📌 面试天下网:一款服务于大一新生的口袋书,让大家在无聊的公共课上可以学习大模型技术!
📌 网站公告:【悬赏 200 元/篇】寻找“大模型面试战场”的一手回忆录

评论专区

评论加载中...