阶段十一:Shell脚本编程之函数与正则表达式

一、Shell函数

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

1. 什么是函数?

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

2. 函数的基本语法

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

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

function_name() {
                command
                command
}

function function_name() {
                command
                command
}

函数调用

函数名称

案例:

menu(){
        cat <<-END
            h        显示命令帮助
            f        显示磁盘分区
            d        显示磁盘挂载
            m        查看内存使用
            u        查看系统负载
            q        退出程序
            END

}

menu                //调用函数

命令作用:

执行结果:

关键参数:

注意事项:

作用:让函数执行完毕后,返回一个结果给\$?

基本语法:

}

return可以结束一个函数,类似于前面讲的循环控制语句break return可以返回0-256中的任意一个值,当然0就代表成功,非0代表失败 如果没有return命令,函数将返回最后一个Shell的退出值


案例:

#!/bin/bash

}

关键参数:

注意事项:


注意事项:链接路径,还是源文件路径必须是绝对路径方式

举个栗子:

软链接特点:

作用:简化软件访问或文件访问路径(可以是文件也可以是文件夹)

区别:删除源文件,则软链接就无法访问了(失效了)

硬链接:在实际工作中,使用较少,主要用于数据备份、版本控制等功能(理解又复制了一个文件,删除源文件,对硬链接没有任何影响)

作用:实现数据备份

基本语法:

注意:没有选项,没有-s


举个栗子:

查看后发现,硬链接文件也是白色的,没有任何颜色的变化
查看后发现,硬链接文件没有箭头指向,文件类型也是普通文件-
从外观和表现上来看,硬链接文件与源文件几乎没有区别
注意:硬链接不同于软链接,硬链接有点类似把文件复制一份,删除源文件对硬链接没有任何影响。
实际工作中,硬链接可以使用文件共享,也可以实现数据备份。


作用:在Linux操作系统中,Shell正则表达式可以用于复杂数据处理(检索、替换、删除)。



注意:正则表达式是一个独立的语言,不仅可以在Shell脚本中使用,在Python中也可以使用

Shell:数据检索、数据处理

Python:数据检索、爬虫技术





…


普通匹配

#!/bin/bash

注意事项:


**注意事项:**



| 代码 | 功能 |
|---|---|
| . | 匹配任意1个字符(除了\n) |
| [^指定字符] | 匹配除了指定字符以外的所有字符,^托字节在字符簇中出现代表取反的意思 |
| \d | 匹配数字,即0-9,\d都称之为Perl风格语法 |
| \D | 匹配非数字,即不是数字 |
| \s | 匹配空白,即 空格,tab键 |
| \S | 匹配非空白 |
| \w | 匹配非特殊字符,即a-z、A-Z、0-9、\_ |
| \W | 匹配特殊字符,即非字母、非数字 |

> 

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

注意事项:


**注意事项:**

#!/bin/bash

小结:

在实际工作中,元字符主要用于匹配我们想要的字符。

代码功能
\*匹配前一个字符出现0次或者无限次,即可有可无,简称0到多
+匹配前一个字符出现1次或者无限次,即至少有1次,简称1到多
?匹配前一个字符出现1次或者0次,即要么有1次,要么没有,简称0或1
{m}匹配前一个字符出现m次,{3},匹配前一个字符只能出现3次
{m,}匹配前一个字符至少出现m次,{3,},匹配前一个字符至少出现3次,相当于3到多
{m,n}匹配前一个字符出现从m到n次,{3,5},匹配前一个字符至少出现3次,至多出现5次

access.log


#!/bin/bash

LOGFILE="/var/log/access.log"

注意事项:

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


#!/bin/bash

LOGFILE="/var/log/application.log"

注意事项:

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


#!/bin/bash

EMAIL_FILE="file_with_emails.txt"

注意事项:


#!/bin/bash

STOCKFILE="/data/stock.txt"

注意事项:

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

#!/bin/bash


**注意事项:**

#!/bin/bash

CONFIG_FILE="/etc/my.cnf"

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

举个栗子:1234-1111-1221-3333

要求:要求使用正则匹配1111以及3333这种格式的数字

要求:要求使用正则匹配1221这种格式的数字

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

\d(\d)(\d)

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

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

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

案例1:

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



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

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



答:([A-Z])\1([A-Z])\2

答:(\w)\1{3}


注:以上都是Perl风格写法,grep必须配合-P使用

小结:

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





access.log

注意事项:

$5获取第5列 /[8-9][0-9]%|100%/ :数字第1位必须是8或9,第2位0-9之间的任一数字 => 80% ~ 99% |或 100%


**注意事项:**

注意事项:

error.log


**注意事项:**




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


安装expect

注意事项:

#!/usr/bin/expect }



**需求3:**shell脚本和expect结合使用,在多台服务器上创建1个用户



#!/bin/bash
    }

#!/bin/bash
        {

        }

        }&

或者
#!/bin/bash
        {

        }

        }&
done<ip.txt

注意事项: