bash中有变量,它有一个很重要的特性:一个变量中仅能存储一个数值;但是,在实际应用中,一个数值往往是达不到我们的需求的,所以这里就引入了数组:能够容纳多个属组元素的连续的内存空间;它的引入使人们的工作效率提高了。

数组分为稀疏数组和稠密数组,其中bash属于稀疏数组。数组中有数组元素:数组中任何一个存放数据的存储单元,其作用相当于一个变量。

数组元素标识分为以下几类:

索引数组标识:所有的数组元素都是使用数字编号的;

通常数字编号是从0开始的,即:0,1,2,3...

关联数组标识:所有的数组元素都可以使用名称(字符串)来标识;

注意:一般在bash4.0以上的版本才有可能支持关联数组;



数组的生命和定义:

1.declare命令:

-a to make NAMEs indexed arrays (if supported)

将其后的变量名称声明为索引数组;

    -A to make NAMEs associative arrays (if supported)

    将其后的变量名称声明为关联数组;


    示例:

    定义稠密数组:

[root@localhost ~]# declare -a NAMES=("zhao" "qian" "sun" "li")
[root@localhost ~]# echo ${NAMES[3]}
li

定义稀疏数组:

[root@localhost ~]# declare -a NAMES=([0]="zhao" [2]="qian" [8]="sun" [10]="li")
[root@localhost ~]# echo ${NAMES[0]}
zhao

2.直接使用变量赋值的方式:

定义稠密的索引数组:

ARRAY_NAME=("value1" "value2" "value3" ...)

定义稀疏的索引数组:

ARRAY_NAME=([0]="value1" [1]="value2" [3]"value3" ...)

定义关联数组:

ARRAY_NAME=([Index_Inanme]='value1' Index_Inanme='value2' ...)



3.分别定义数组元素:

ARRAY_NAME[0]='value1'

ARRAY_NAME[1]='value2'

ARRAY_NAME[2]='value3'

...

ARRAY_NAME[N-1]='value(n-1)'


[root@localhost ~]# STUDENT_INF[O]='xiaoma'
[root@localhost ~]# STUDENT_INF[1]='22'
[root@localhost ~]# STUDENT_INF[2]='123456789'
[root@localhost ~]# echo ${STUDENT_INF[0]}
xiaoma
[root@localhost ~]# echo ${STUDENT_INF[1]}
22
[root@localhost ~]# echo ${STUDENT_INF[2]}
123456789


引用数组元素的方式:

${ARRAY_NAME[INDEX]}

注意:如果在引用数组元素时没有给出具体的索引编号,则默认编号为"0",即显示第一个数组元素的数值;


引用整个数组中所有元素:

${ARRAY_NAME[*]}或者${ARRAY_NAME[@]}


[root@localhost ~]# STUDENT_INF[O]='xiaoma'
[root@localhost ~]# STUDENT_INF[1]='22'
[root@localhost ~]# STUDENT_INF[2]='123456789'
[root@localhost ~]# echo ${STUDENT_INF[*]}
xiaoma 22 123456789
[root@localhost ~]# echo ${STUDENT_INF[@]}
xiaoma 22 123456789

引用整个数组的所有元素的索引号:

${!ARRAY_NAME[*]}或者${!ARRAY_NAME[@]}


[root@localhost ~]# echo ${!STUDENT_INF[@]}
0 1 2
[root@localhost ~]# echo ${!STUDENT_INF[*]}
0 1 2

查看数组中的元素个数(数组长度):

${#ARRAY_NAME[*]}或者${#ARRAY_NAME[@]}

[root@localhost ~]# echo ${STUDENT_INF[@]}
xiaoma 22 123456789
[root@localhost ~]# echo ${#STUDENT_INF[*]}
3
[root@localhost ~]# echo ${#STUDENT_INF[@]}
3


数组切片:

${ARRAY_NAME[*]:offset}或者${ARRAY_NAME[@]:offset}

//显示包括offset数值所对应表示的元素及其后所有的元素;

[root@localhost ~]# echo ${NAMES[@]}
zhao qian sun li
[root@localhost ~]# echo ${NAMES[@]:2}
qian sun li

           ${ARRAY_NAME[*]:offset:number}或者${ARRAY_NAME[@]:offset:number}

//显示数组中包括offset数值所对应表示的位置的元素及其后number个元素的值;

[root@localhost ~]# echo ${NAMES[@]}
zhao qian sun li
[root@localhost ~]# echo ${NAMES[@]:2:2}
qian sun


撤销数组:

unset ARRAY_NAME

RANDOM变量:位置:/dev/random

随机数变量:0-32767,整数值;

[root@localhost ~]# echo $RANDOM
383
[root@localhost ~]# echo $RANDOM
30783

随机数如何生成的:

从熵池中取随机数;

熵池:

/dev/random

两次敲击键盘的时间间隔;

两次IO的时间间隔;

...

/dev/uradom:伪熵池

利用应用程序计算得到的随机数;