• shell函数与正则


    函数

    个人理解的函数,是将实现某一功能的代码块抽离封装以实现代码的复用

    函数定义

    #函数定义格式
    [function] 函数名 [()]
    {
    	代码块
    	[return int;]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注:
    (1)此处中括号代表可选,即用户可以以下几种方式进行函数定义

    #!/bin/bash
    
    f1()
    {
            echo "你好"
    }
    
    function f2
    {
            echo "世界"
    }
    
    function f3()
    {
            echo "hello world"
    }
    
    f1
    f2
    f3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行后效果如图所示:
    在这里插入图片描述
    (2)return用于结束一个函数return后代码不执行;return语句可以不加,不加以最后一条命令运行结果作为返回值;return后跟数值范围为0-255

    不带return的示例如下:

    #!/bin/bash
    #实现两个数相加
    add()
    {
            y=$(($1+$2))
            echo "a与b相加的和为 ${y}"
    }
    #赋值
    read -p '请依次输入a,b的值(中间以空格分隔):' a b
    #调用函数且传递参数
    add ${a} ${b}
    #输出函数返回值
    echo $?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行效果如下:
    在这里插入图片描述
    带return的示例如下:

    #!/bin/bash
    add()
    {
            y=$(($1+$2))
            echo "a与b相加的和为 ${y}"
            return ${y}
    }
    
    
    read -p '请依次输入a,b的值(中间以空格分隔):' a b
    
    add ${a} ${b}
    echo $?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行效果如下:
    在这里插入图片描述
    (3)函数内普通声明的变量作用于脚本全局,若想其只在函数内起作用在变量名前加local即可
    简单示例如下:

    #!/bin/bash
    
    a()
    {
            a=1
            local b=2
    }
    
    a=3
    b=4
    
    echo "调用函数前a为${a},b为 ${b}"
    a
    echo "调用函数a后a为${a},b为${b}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行效果如下:
    在这里插入图片描述
    拓:可将函数定义到用户环境变量(vi ~/.bashrc)中以直接调用。
    简单示例如下:

    • 第一步修改文件:

    在这里插入图片描述

    • 第二步使文件在当前窗口生效

    在这里插入图片描述

    • 第三步调用函数即可

    在这里插入图片描述

    函数调用

    • shell窗口调用

    第一步使相关函数文件生效:

    source 函数所在文件名 
    
    • 1

    第二步调用:

    #不传递参数
    函数名
    #传递参数
    函数名 参数1 参数2 参数3
    
    • 1
    • 2
    • 3
    • 4
    • 脚本内调用
    函数名
    
    • 1

    注:函数定义必须写在函数调用前否则会找不到该函数,此处可做如下理解A问B认不认识C,B已经告诉了A不认识,然后C又告诉了B他叫C;用户可自行理解一句话概括就是函数定义就是我告诉你我是谁且我能干什么,函数调用就是通过函数名使用该函数

    • 调用另一脚本中函数

    第一步使其生效:

    #在脚本中编写source或.命令
    source 函数所在文件名
    
    • 1
    • 2

    第二步调用:

    #不传递参数
    函数名
    #传递参数
    函数名 参数1 参数2 参数3
    
    • 1
    • 2
    • 3
    • 4

    简单示例如下:
    在这里插入图片描述

    source 与. 两种执行方式无差别,source即为.

    正则

    正则表达式(Regular Expression、regex或regexp,缩写为RE)是一种字符模式,用于查找过程中匹配指定的字符。许多语言支持正则,如python,java等(模糊查询)

    linux中支持正则表达式的程序有find、vi、grep、sed、awk

    相关名词解释如下:

    • 元字符——在正则表达式中具有特殊意义的字符:点(.)、星(*)、问号(?)
    • 前导字符——位于元字符前一字符

    常用元字符

    在这里插入图片描述
    示例文本(1.txt)内容如下:

    gle
    gooogle
    taobao.com
    taotaobaobao.com
    
    jingdong.com
    dingdingdongdong.com
    10.1.1.1
    192.168.21.133
    hello world
    helloworld yourself
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    示例1——o出现0次或多次的行
    在这里插入图片描述
    示例2——匹配g后不限长度字符
    在这里插入图片描述
    示例3——匹配行首为g的行
    在这里插入图片描述
    示例4——匹配行中包含a,b,ab,ba的行
    在这里插入图片描述

    其他元字符

    在这里插入图片描述
    注:表格中所有\符号用户均可理解为转义字符
    示例1——取单词头为h的行
    在这里插入图片描述
    示例2——取单词尾为world的行
    在这里插入图片描述
    示例3——取单词hello所在的行
    在这里插入图片描述
    示例4——匹配文件中连续出现两个数字的行
    在这里插入图片描述

    示例5——匹配文件中的ip地址
    在这里插入图片描述
    示例6——vi模式下将192.168.21.133替换为192.168.21.122
    在这里插入图片描述
    在这里插入图片描述
    示例7——匹配数字
    在这里插入图片描述

    扩展元字符

    以下表中扩展元字符均需在grep -E或egrep模式下使用

    在这里插入图片描述
    示例1——匹配一个或多个o出现的行,且o在g后
    在这里插入图片描述
    示例2——匹配行中出现a或b的行
    在这里插入图片描述
    示例3——匹配出现helloworld或hiworld的行
    在这里插入图片描述
    示例4——匹配出现1-4次o的行
    在这里插入图片描述

    在这里插入图片描述
    示例1——显示数字行
    在这里插入图片描述

  • 相关阅读:
    信息化与信息系统1
    JMeter:断言之响应断言
    【Qt图形视图框架】QGraphicsView分析
    【Spring Cloud】黑马头条 用户服务创建、登录功能实现
    万兆以太网MAC设计(8)ICMP协议详解以及ICMP层模块设计
    Java的finalize方法探究
    【区块链 | Compound】5.剖析DeFi借贷产品之Compound:延伸篇
    MySQL中删除数据库中表格customer出现报错
    【MySQL基础】如何安装MySQL?如何将MySQL设置成服务?
    【巨杉数据库】银行流水查询系统设计
  • 原文地址:https://blog.csdn.net/weixin_51371629/article/details/126555105