2.索引数组和关联数组,求随机数,递归调用

发布时间 2023-05-21 18:34:39作者: 碧雪殇情

总结索引数组和关联数组,字符串处理,高级变量使用及示例。

数组

1.数组介绍

变量:存储单个元素的内存空间

数组;存储多个元素的连续的内存空间,相当于多个变量的集合。

数组名和索引

索引的编号从0开始,属于数组索引

索引支持自定义的格式,而不仅是数值格式,即为关联索引。

Bash的数组支持稀疏格式(索引不连续)

2.声明数组

#普通数组可以不声明,直接使用

declare -a ARRAY_NAME

#关联数组必须先声明,后使用

declare -A ARRAY_NAME

注意:#两种类型的数组不相互转换

3.数组赋值

(1)一次只赋值一个元素

ARRAY_NAME[INDEX]=VALUE

(2)一次赋值多个元素

ARRAY_NAME=("VAL1" "VAL2"...)

title=(ceo coo cto)

num=({1..10})

alpha=({a..z})

file=(*.txt)

(3)只赋值特定元素

ARRAY_NAME=([0]="VAL1" [3]="VAL2"...)

(4)交互式赋值

read -a ARRAY

  1. 显示所有数组

declare -a

  1. 引用数组

#引用数组中某个元素

${ARRAY_NAME[INDEX]}

#如果省略[INDEX]表示引用下标为0的元素

#引用数组所有元素

${ARRAY_NAME[*]}

${ARRAY_NAME[@]}

#输出数组长度

${#ARRAY_NAME[*]}

${#ARRAY_NAME[@]}

6删除数组

unset ARRAY_NAME[INDEX] 删除数组中某个元素

unset ARRAY_NAME 删除整个数组

7数组数据处理

数组切片

${ARRAY_NAME[@]:offset:number}

${ARRAY_NAME[*]:offset:number}

offset 要跳过的元素个数

number 要取出的元素个数

#取偏移后的所有元素

${ARRAY_NAME[@]:offset}

${ARRAY_NAME[*]:offset}

8.关联数组

关联数组必须先声明,再调用

declare -A ARRAY_NAME

ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2'...)

ARRAY_NAME[idx_name3]='val3'

9.字符处理

基于偏移量取字符串

返回字符串变量var的字符的长度,一个汉字/字母算一个字符

${#var}

[root@rocky8~]# str='jkdsfjgj'

[root@rocky8 ~]# echo $str

jkdsfjgj

[root@rocky87 ~]# echo ${#str}

10.基于模式取子串

从左往右,查找var变量所存储的字符串中,删除字符串开头到第一次出现word字符的部分(包含word字符串),即懒惰模式,即非贪婪模式

${var#*word}

与其对应的贪婪模式

${var##*word}

从var变量的字符串中删除以word开头的部分

${var#word} 与其对应的贪婪模式${var##word}

[root@rocky8 ~]# echo $var

qwer1234

[root@rocky8~]# echo ${var#qw}

er1234

[root@rocky8~]# echo ${var#w}

qwer1234

从右往左,查找var变量所存储的字符串中,删除字符串从最后开始到第一次出现word字符的部分(包含word字符串),即懒惰模式,即非贪婪模式

${var%word*}

与其对应的贪婪模式

${var%%word*}

[root@rocky8 ~]# echo ${str}

abcdefg

[root@rocky8 ~]# echo ${str#*cd}

efg

[root@rocky8 ~]#

[root@rocky8~]# echo ${str%%cd*}

ab

[root@rocky8 ~]#

从var变量的字符串中删除以word结尾的部分

${var%word} 与其对应的贪婪模式${var%%word}

[root@rocky8 ~]# echo $var

qwer1234

[root@rocky8 ~]# echo ${var%34}

qwer12

[root@rocky8 ~]# echo ${var%3}

qwer1234

[root@rocky8 ~]#

11.高级变量

高级变量赋值

有类型变量

Shell变量一般是无类型的,但是bash shell提供了declare和typese两个命令用于指定变量的类型,两个命令是等价的。

变量间接引用。

eval命令:eval命令首先扫描命令行所有的置换,然后再指定该命令行

[root@rocky8~]# cmd=whoami

[root@rocky8~]# eval $cmd

root

[root@rocky8~]# n=10;echo {1..$n}

{1..10}

[root@rocky8~]# n=10;eval echo {1..$n}

1 2 3 4 5 6 7 8 9 10

间接变量应用

如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值称之为变量引用。

求10个随机数的最大值与最小值。

then max=$num;min=$num;fi;echo -n $num ' ' ;if [[ $num -gt $max ]];then max=$num;elif [[ $num -lt $min ]];then min=$num ;fi;done;echo "中最大值为 $max ;最小值为 $min"

401 32637 6892 3874 11127 8376 9434 9433 22265 2076 中最大值为 32637 ;最小值为 401

使用递归调用,完成阶乘算法实现

fact() { if [ $1 -eq 0 -o $1 -eq 1 ] ;then echo 1;else echo $[$1*$(fact $[$1-1])] ;fi };fact 8