第六章Shell脚本:shell函数,数组、正则表达式

一、shell函数

1、函数的作用

2、函数使用步骤

3、定义函数基本格式

4、函数变量

5、退出函数

6.函数位置变量与脚本位置变量区别

二、shell数组

1、数组分类

2、定义数组方法

三、正则表达式

1、元字符

2、表示次数

3、位置锚定

4、分组

5、扩展正则表达式


一、shell函数

1、函数的作用

定义较为复杂的但是需要重复使用的内容,以便再次使用可以直接调用函数节约时间,提高效率

2、函数使用步骤

①首先是定义函数

②其次是调用函数(注意:若定义完成不调用则函数无效)

③查看系统限制所有函数:declare -F

④查看函数定义详细内容:declare -f 函数名

⑤删除函数:unset 函数名

3、定义函数基本格式

①function 函数名 () {

函数内容

}

②function 函数名 {

函数内容

}

③函数名 () {

函数内容

}

4、函数变量

①函数中的变量默认为全局生效,若想要限制函数中的变量只在本函数中生效则在定义变量时使用local 变量名=变量值的格式。

5、退出函数

①exit退出函数,脚本中使用exit退出函数时直接退出整个脚本,脚本后续内容不再执行。

②return退出函数,脚本使用return退出函数时只退出函数,不影响脚本后续内容执行。

6、函数位置变量与脚本位置变量区别

①当函数中有$1、$2等位置变量时表示的是调用函数时函数名后跟着的位置变量123

②函数外的$1、$2等才表示是执行脚本时脚本名称后跟着的位置变量123

二、shell数组

1、数组分类

关联数组:必须声明才可以使用,命令:delare -A 数组名

②普通数组:利用数字下标节约变量,可以不声明也可以声明,命令:delare -a 数组名

delare -a命令也可查看有哪些普通数组

2、定义数组方法

①普通数组

数组名=(vlaue0 vlaue1 vlaue2 ...)

[root@pc1 ~]#a=(10 20 30) #定义数组a,值为10 20 30

[root@pc1 ~]#echo ${a[0]} #输出数组a下标为0的元素

10

[root@pc1 ~]#echo ${a[@]} #输出数组a中所有的元素

10 20 30

[root@pc1 ~]#echo ${a[*]} #输出数组a中所有的元素

10 20 30

[root@pc1 ~]#echo ${#a[@]} #输出数组a中元素的个数

3

[root@pc1 ~]#echo ${!a[@]} #输出数组a中元素的下标

0 1 2

[root@pc1 ~]#a[0]=100 #重新定义数组a下标为0的元素为100

[root@pc1 ~]#echo ${a[0]} #输出数组a中下标为0的元素

100

②关联数组定义

delare -A 数组名 #声明数组

数组名[下标]=元素 #定义关联数组

[root@pc1 ~]#declare -A f #声明关联数组f

[root@pc1 ~]#f[name]=pc1 #定义关联数组f下标name的元素为pc1

[root@pc1 ~]#f[ip]=10.0.0.0 #定义关联数组f下标ip的元素为10.0.0.0

[root@pc1 ~]#echo ${f[@]} #输出关联数组f的所有元素值

pc1 10.0.0.0

[root@pc1 ~]#echo ${!f[@]} #输出关联数组f中元素的所有下标

name ip

三、正则表达式

1、元字符

①.:在正则表达式中.表示任意单个字符。

[root@pc1 data]#grep -o r.t /etc/passwd #过滤passwd文件中开头为r中间任意单个字符结尾为t的内容

rat

rat

rat

[root@pc1 data]#grep -o r..t /etc/passwd #过滤passwd文件中开头为r中间任意2个字符结尾为t的内容

root

root

root

root

r/ft

[root@pc1 data]#grep -o r...t /etc/passwd #过滤passwd文件中开头为r中间任意3个字符结尾为t的内容

rtkit

②[ ]:在正则表达式中[ ]表示匹配[ ]中任意一个字符。

[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件夹

[root@pc1 data]#ls #显示文件夹内容

a.txt b.txt c.txt

[root@pc1 data]#ls |grep '[a-z].txt' #使用grep过滤ls中有任意一个a-z字母.txt的文件

a.txt

b.txt

c.txt

③[^]:在正则表达式中表示匹配[ ]中外的任意单个字符。

[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件

[root@pc1 data]#touch {0..2}.txt #创建0-2.txt文件

[root@pc1 data]#ls #显示文件

0.txt 1.txt 2.txt a.txt b.txt c.txt

[root@pc1 data]#ls |grep '[^0-9].txt' #过滤ls显示文件中除去0-9任意字符.txt文件

a.txt

b.txt

c.txt

[root@pc1 data]#ls |grep '[^a-z].txt' #过滤ls显示文件中除去a-z任意字符.txt文件

0.txt

1.txt

2.txt

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]

[:upper:] 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

[:digit:] 十进制数字

[:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 标点符号

2、表示次数

①*:表示匹配前面字符任意次,包括0次。

[root@pc1 ~]#echo ac |grep 'ab*c' #ab之间不输入b可匹配

ac

[root@pc1 ~]#echo abc |grep 'ab*c' #ab之间输入1个b可匹配

abc

[root@pc1 ~]#echo abbc |grep 'ab*c'#ab之间输入2个b可匹配

abbc

②.*:表示匹配前面字符任意次,不包括0次。

[root@pc1 ~]#echo ac |grep 'ab.*c' #ac之间不输入b匹配不到

[root@pc1 ~]#echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配

abc

[root@pc1 ~]#echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配

abbc

③\?:表示匹配前面的字符1次或0次,即可有可无。

[root@pc1 ~]#echo ac | grep 'ab\?c' #ac之间不输入b可以匹配

ac

[root@pc1 ~]#echo abc | grep 'ab\?c' #ac之间输入1个b可以匹配

abc

[root@pc1 ~]#echo abbc | grep 'ab\?c' #ac之间输入2个b匹配不到

④\+:表示匹配前面的字符最少1次。

[root@pc1 ~]#echo ac | grep 'ab\+c' #ac之间不输入b匹配不到

[root@pc1 ~]#echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配

abc

[root@pc1 ~]#echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配

abbbbc

⑤\{n\}:表示匹配前面的字符n次。

[root@pc1 ~]#echo abbbc |grep 'ab\{3\}c' #输出abbbc匹配ac之间b字符出现3次可以匹配

abbbc

[root@pc1 ~]#echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到

⑥\{m,n\}:表示匹配前面的字符最少m次最多n次。

[root@pc1 ~]#echo abc |grep 'ab\{1,3\}c' #输出abc匹配ac之间b出现最少1次最多3次可以匹配

abc

[root@pc1 ~]#echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配

abbc

[root@pc1 ~]#echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配

abbbc

[root@pc1 ~]#echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到

⑦\{m,\}:表示匹配前面的字符最少m次。

⑧\{,n\}:表示匹配前面的字符最多n次。

3、位置锚定

①^表示以什么字符开头的行。

②$表示以什么字符为结尾的行。

③^PATTERN$ 表示用于模式匹配整行 (单独一行 只有PATTERN字符)。

④^$ 表示空行。

⑤\< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)。

⑥\> 或 \b #词尾锚定,用于单词模式的右侧。

⑦\<PATTERN\> #匹配整个单词。

[root@pc1 ~]#cat a.txt #查看a.txt内容

root

abc abd abf abe

asfase

asdfasfewe

[root@pc1 ~]#cat a.txt |grep '^a' #查看a.txt内容过滤以a开头的行

abc abd abf abe

asfase

asdfasfewe

[root@pc1 ~]#cat a.txt |grep 'e$' #查看a.txt内容过滤以e为结尾的行

asfase

asdfasfewe

[root@pc1 ~]#cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行

root

[root@pc1 ~]#cat a.txt |grep '\ba' #查看a.txt过滤以a开头的词

abc abd abf abe

asfase

asdfasfewe

[root@pc1 ~]#cat a.txt |grep 'e\b' #查看a.txt过滤以e为结尾的词

abc abd abf abe

asfase

asdfasfewe

[root@pc1 ~]#cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc

abc

4、分组

()将多个字符捆绑在一起当做一个整体处理

[root@pc1 ~]#echo abcccc |grep "abc\{4\}" #匹配输出内容c出现4次

abcccc

[root@pc1 ~]#echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到

[root@pc1 ~]#echo abcabcabcabc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次匹配成功

abcabcabcabc

5、扩展正则表达式

①使用方法

grep -E选项加正则表达式内容,与正常正则表达式区别在于不用在匹配时添加 \

②表示次数

* 匹配前面字符任意次

? 0或1次

+ 1次或多次

{n} 匹配n次

{m,n} 至少m,至多n次

{,n} #匹配前面的字符至多n次,<=n,n可以为0

{n,} #匹配前面的字符至少n次,<=n,n可以为0

③表示分组

() 分组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值