Linux学习62 shell脚本高级编程-数组和字符串处理
一、回顾
1、函数,case语言
2、case语句
3、函数:结构化编程,代码重用
二、数组
1、程序=指令+数据
a、指令:
b、数据:变量、文件
2、数组
a、变量:存储单个元素的内存空间
b、数组:存储多个元素的连续的内存空间。比如hello,就有五个字节,而我们的数组名就是起始的一个最小的地址,如果我们想使用数组名称去分别引用数组中的每一个元素时该怎么实现呢?因此此时我们就要使用数组的索引机制
c、数组名:整个数组只有一个名字
d、数组索引:编号从0开始
数组名[索引]
${ARRAY_NAME[INDEX]}
3、数组声明
a、declare -a NAME:声明索引数组
b、declare -A NAME:声明关联数组
c、必须要申明为关联数组时才是关联数组,否则默认为索引数组
4、数组中元素的赋值方式
a、一次只赋值一个元素,如果引用数组名他引用的是第0个元素
ARRAY_NAME[INDEX]=value
b、一次赋值全部元素
ARRAY_NAME=("VAL1" "VAL2" "VAL3"...)
c、只赋值特定元素
ARRAY_NAME=([0]="VAL1" [3]="VAL4" ...)
注意:bash支持稀疏格式的数组,即如上
d、read -a ARRAY_NAME
5、引用数组中的元素:${ARRAY_NAME[INDEX]}
a、注意:引用时,只给数组名,表示引用下标为0的元素
b、引用数组中的所有元素
(1)、${ARRAY_NAME[*]}
(2)、${ARRAY_NAME[@]}
c、数组元素切片,即只取出数组中某些元素:${ARRAY_NAME[@]:offset:number}
(1)、offset:要路过的元素个数
(2)、number:要取出的元素个数,省略number时表示取偏移量后面的所有元素
6、数组的长度(数组中元素的个数)
a、$(#ARRAY_NAME[*])
b、$(#AEEAY_NAME[@])
7、向数组中追加元素:
a、ARRAY_NAME[${#ARRAY_NAME[*]}]=
8、删除数组中的某元素
a、unset ARRAY[INDEX]
9、关联数组
a、declare -A ARRAY_NAME
ARRAY_NAME=([index_name1]="value1" [index)_name2]="value2")
7、练习
a、示例生成10个随机数,并找出其中的最大值和最小值
b、定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件,统计其下标为偶数的文件中的行数之和
files=(/var/log/*.log)
三、bash的内置字符串处理工具
1、字符串切片
a、${var:offset:number}:取字符串的子串
-4表示从右向前数的第四个字符
b、取字符串的最右侧的几个字符:${var: -length} ,冒号右侧必须有一个空白字符
2、基于模式取子串
a、${var#*word}:其中word是指定的分隔符,功能:自左而右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符
b、${var##*word}:其中word是指定的分隔符,功能:自左而右,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符
c、${var%word*}:其中的word是指定的分隔符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除此分隔符至字符串尾部之间的所有字符
d、${var%%word*}:其中的word是指定的分隔符,功能:自右而左,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除此分隔符至字符串尾部之间的所有字符
3、查找替换
a、${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
b、${var//PATTERN/SUBST}:查找var所表示的字符串中,所有被PATTERN所匹配到的字符串,将其全部替换为SUBSTI所表示的字符串
c、${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
d、${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
e、注意:PATTERN中使用glob风格和通配符
4、查找删除
a、${var/PATTERN}:以PATTERN为模式查找var字符串中第一次的匹配,并删除之
b、${var//PATTERN}:以PATTERN为模式查找var字符串中所有的匹配,并删除之
c、${var/#PATTERN}:以PATTERN为模式查找var字符串中行首的匹配,并删除之
d、${var/%PATTERN}:以PATTERN为模式查找var字符串中行尾的匹配,并删除之
5、字符大小写转换
a、${var^^}:把所有小写字母转换为大写
b、${var,,}:把var中的所有大写字母转换为小写
6、变量赋值:
a、${var:-VALUE}:如果var变量为空,或未设置,那么返回VALUE;否则则返回var变量的值
b、${var:=VALUE}:如果var变量为空,或未设置,那么返回VALUE,并将VALUE赋值给var变量,否则则返回var的值
c、${var:+VALUE}:如果var变量不空,则返回VALUE;
d、${var:?ERROR_INFO}:如果var为空,或未设置,那么返回ERROR_INFO为错误提示,否则,则返回var值
四、练习:写一个脚本,完成如下功能
1、提示用户输入一个可执行命令的名称
2、获取此命令所依赖到的所有库文件列表
3、复制命令至某目标目录(例如/mnt/sysroot)下的对应的路径中
bash,/bin/bash ==> /mnt/sysroot/bin/bash
useradd,/usr/sbin/useradd ==> /mnt/sysroot/usr/sbin/useradd
4、复制此命令依赖到的所有库文件至目标目录下的对应路径下
/lib64/ld-linux-x8664.so.2 ==> /mnt/sysroot/lib64/ld-linux-x8664.so.2
5、进一步
每次复制完成一个命令后,不要退出,而是提示用户继续输入要复制的其它命令,并重复完成如上所描述的功能,直到用户输入"quit"退出脚本。