04_函数与正则表达式

一、Shell函数

作用:Shell函数就是用于解决代码重用问题(封装)(让代码可以重复使用)

1. 什么是函数?

Shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为Shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。

2. 函数的基本语法

# 常见
函数名()   {
    函数体(一堆命令的集合,来实现某个功能)   
}

# 标准方式
function 函数名()   {
    函数体(一堆命令的集合,来实现某个功能)  
}
#!/bin/bash

# 函数对公用代码的提取和封装,让后续调用时变量简单也便于维护
# 函数组成
##  函数名  名称的规范围和变量规范是一样的  必须
##  参数[选项]    非必须
##  业务代码(函数体)  必须
##  返回值[状态码0-255]  $? 接受   非必须

# 函数的定义需要小括号,定义它是让shell知道我现在有这个函数可以用
# 调用函数(执行函数),不需要写小括号,真正的让函数中的函数体执行起来

# 函数定义  无参数
test1() {
    echo '你好'
    echo 'haha'
}

# 无参数的函数调用
test1

命令作用:

执行结果:

关键参数:

注意事项:

title=$1 cnt=$2

}


**关键参数:**

**注意事项:**


}


--------------------提升一下------------------

}

关键参数:

注意事项:

#!/bin/bash

n1=$1 n2=$2

}

---------------------------------------------- n1=$1 n2=$2

}

结果:5


**注意事项:**




![](/assets/feishu-images/94f03fd3b6e7d73311c8a8b3.png)

项目核心需求:







----------------------------------每天执行的任务文件-------------------------------------------
#!/bin/bash




filename="backup-$prev_day.tar.gz"



    backupPath=/backup/$curr_month

注意事项:


**注意事项:**



| 代码 | 功能 |
|---|---|
| . | 匹配任意1个字符(除了\n) -E  |
| [^指定字符] | 匹配除了指定字符以外的所有字符,^托字节在字符簇中出现代表取反的意思 [^abc]  除了a或b或c以外都匹配 |
| \d | 匹配数字,即0-9,\d都称之为Perl风格语法  -P |
| \s | 匹配空格,tab键  -P    [[:space:]] |
| \w | 匹配非特殊字符,即a-z、A-Z、0-9、\_     -P |
| \b  | 边界符  匹配的字左右要有分界,一般为空格   -PE  \\<\\>  也可以当作边界符 |
| \| | 或  jpg\|png\|gif   在jpg或png或gif 中匹配其中之一  -E |
| ^ | 以什么什么开头  ^root   当前行以root开头 |
| \$ | 以什么什么结尾   root\$   当前行以root结尾 |


案例1:查找包含小写字母的行

11111111
111ccc

---------------------------------------
111ccc


11111111
111ccc

11111111

1111111

注意事项:


**注意事项:**


192.168.50.213

注意事项:

系统错误发生在2025-01-04 用户退出


**注意事项:**

系统错误发生在2025-01-04

注意事项:

valid.email@example.com another.email@domain.org invalid-email.com yet.another.email@sub.domain.co.uk 123@numbers.com missingatsign.com email@valid-domain.com not_a_valid_email@com


**注意事项:**

valid.email@example.com
another.email@domain.org
yet.another.email@sub.domain.co.uk
123@numbers.com
email@valid-domain.com
valid.email@example.com
another.email@domain.org
yet.another.email@sub.domain.co.uk
123@numbers.com
email@valid-domain.com

注意事项:


**注意事项:**


---

注意事项:

代码功能
^托字节,匹配字符串开头,^/dev:匹配以/dev开头的行
\$匹配字符串结尾

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin lp:x:4:7:root:/var/spool/lpd:/sbin/nologin ep:x:4:7:root:/var/spool/lpd:/sbin/nologin

SELINUX=disabled SELINUXTYPE=targeted


**注意事项:**



作用:主要是进行重复数据的匹配操作

如要求使用正则匹配1111以及3333这种格式的数字,就可以用到分组捕获


在正则表达式中,通过一对圆括号括起来的内容,我们就称之为"分组"。

\d(\d)(\d)

正则表达式中\d\d\d中,\d(\d)(\d)就是子表达式,一共有两个()圆括号,则代表两个分组


当正则表达式在字符串中匹配到相应的内容后,计算机系统会自动把分组所匹配的到内容放入到系统的对应缓存区中(缓存区从\0开始)

自定义分组它是从\1开始。






在正则表达式中,我们可以通过\n(n代表第n个缓存区的编号)来引用缓存区中的内容,我们把这个过程就称之为"反向引用"。

案例1:


答:[0-9]{4}或\d{4}

1234 1111 2222 3333


**注意事项:**

1234
1221
3443

答:(\d)(\d)\2\1

注意事项:


**注意事项:**

111
6262
3333
3343

3333

注意事项:

----------------------------------------------------

192.168.1.10 172.16.0.2 192.168.2.3 10.0.0.4


**注意事项:**

7

6

注意事项:

-------------------------------------------------------------------------------------


**注意事项:**




作用:解决大部分脚本需要用户交互的场景,通过expect让脚本变成完全自动化形式。


安装expect

注意事项:

#!/usr/bin/expect }



![](/assets/feishu-images/e09995791cfa3b7034307b09.png)

#!/bin/bash


host=$1
password=$2


注意事项:

本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。