总结索引数组和关联数组,字符串处理,高级变量使用及示例。
数组
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
- 显示所有数组
declare -a
- 引用数组
#引用数组中某个元素
${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
标签:数组,递归,echo,随机数,ARRAY,root,rocky8,NAME From: https://www.cnblogs.com/m490545607/p/17418951.html