• shell编程之函数与正则表达式


    shell函数

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

    格式:shell函数很简单,函数名后跟双括号,在跟双大括号。通过函数名直接调用,不加小括号

      func () {  #指定函数名

      command  #函数体

      }

      实例:1

        #!/bin/bash

        func () {

        echo "这里是怪人的地盘"

        }

        func

        

        bash test.sh

        这里是怪人的地盘

       

       实例:2

        函数返回值

        #!/bin/bash

        func () {

        VAR=$((1+1))

        return $VAR

        echo "这里是怪人的地盘"

        }

        func

        echo $?

        

        bash test.sh

        2

        return 在函数中定义状态返回值,返回并终止函数,单反毁的只能是0-255的数字,类似于exit

       实例:3 

        函数传参

        #!/bin/bash

        func () {

        echo "Hello $1"

        }

        func world

        bash test.sh

        Hello world

        通过shell位置参数给函数传参

    shell正则表达式

    正则表达式在每种语言中都有,功能就是匹配符合你预期要求的字符串

    shell正则分为两种:

      基础正则表达式

      扩展正则表达式:+ ? | ()

    1.正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法

    2.通过定义的这些 特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串,linux正则表达式一般以行为单位处理

    正则表达式和通配符的本质区别

    1.不需要思考的判断方法,在三剑客awk,sed,grep中都是正则,其他的都是通配符

    2.区别通配符和正则表达式最简单的方法

      (1)匹配文件目录名====》通配符

      (2)匹配文件内容====》正则表达式

    以grep为例举例说明正则表达式

        注意:在匹配模式中一定要加上引号

    符号 描述 实例
    . 匹配单个必须存在的字符

    l..e

    可以表示

    love

    like

    leee

    不可以表示的

    labcde

    le

    lee

    ^ 匹配以“”开头的行

    匹配以 abc 开头的行:

    echo -e "abc xyz" |grep ^abc

    $ 匹配以“”结尾的行

    匹配以 xyz 结尾的行:

    echo -e "abc xyz" |grep xyz$

    * 前面字符出现零到多次

    a*  表示出现任意个a的情况

    a*b 表示b前面有任意个a的情况(包括没有a的情况)

    .* 表示任意字符出现零到多次

    过滤出一行中a在前,b在后的行

    条件:

    包含 a 和 b

    字母 a 必须在 b前面

    # grep --color "a.*b" b.txt

    +(扩展正则) 表示前面字符出现至少一次

    匹配 abc 和 abcc:

    echo -e "abc abcc add" |grep -E 'ab+'

    匹配单个数字:echo "113" |grep -o '[0-9]'

    连续匹配多个数字:echo "113" |grep -E -o '[0-9]+'

    ?(扩展正则) 表示前面字符最多出现一次

    匹配 ac 或 abc:

    echo -e "ac abc add" |grep -E 'a?c'

    [] 表示范围内的一个字符

    例子:过滤出包含小写字母的行       grep [a-z] a.txt

    例子:过滤出包含大写字母的行       grep [A-Z] a.txt

    例子:过滤出包含数字的行           grep [0-9] a.txt

    例子:过滤出包含数字和小写字母的行 grep [0-9a-z] a.txt

    例子:过滤出包含字母asf的行        grep [asf] a.txt

    [.-.] 匹配括号中的任意一个字符

    匹配所有字母

    echo -e "a b c" |grep '[a-z]'

    [^] 匹配除了某字符的任意一个字符

    匹配 a 或 b:

    echo -e "a b c" |grep '[^c-z]'

    匹配末尾数字:echo "abc:cde;123" |grep -E

    '[^;]+$'

    ^[^] 匹配除了某字符开头的行

    匹配不是#开头的行:

    grep '^[^#]' /etc/httpd/conf/httpd.conf

    {n}或{n,}

    {n}:表示严格匹配n个字符

    {n,}:表示花括号钱的字符至少存在n个

    echo "aadadccc" | egrep "a{2}"

    echo "aadadccc" | egrep "a{1}"

    {n,m}

    匹配字符至少出现n次,最多出现m次

    "ac{2,5}b" 匹配a和b之间有最少2个c最多5个c的行

    "ac{,5}b" 匹配a和b之间有最多5个c的行

    "ac{2,}b" 匹配a和b之间有最少2个c的行

    < 锚定单词首部(匹配字符必须以锚定字符开头) # echo "hi,root,iamroot" | grep "<root"
    hi,root,iamroot
    > 锚定单词尾部(匹配字符必须以锚定字符结尾) # echo "hi,root,iamroot" | grep "root>"
    hi,root,iamroot
    () 1 调用前面的第一个分组

    例子:过滤出一行中有两个相同数字的行

    # grep "([0-9]).*1" inittab

    例子:过滤出行首和行位字母相同的行

    # grep "^([a-z]).*1$" inittab

    |(扩展正则) 匹配 | 两边的任意一个

    过滤出cat 或者Cat

    # grep "cat|Cat" a.txt

    # grep "(C|c)at" a.txt

    总结

    正则表达式

    一、字符匹配

    .

    []

    [^] 

    二、次数匹配

    *

    {m,n} 

    三、锚定

    ^

    $

    <

    四、分组

      ()

      1

    扩展正则表达式

    grep -E

    egrep

    一、字符匹配

    .

    []

    [^]

    二、次数匹配

    *

    {m,n}

    + 表示其前面的字符出现最少一次的情况

    ?表示其前面的字符出现最多一次的情况

    三、锚定

    ^

    $

    <

    >

    四、分组

      ()

      1

      2

    五、或

    |

    一.、正则表达式中的{}以及()都需要加上进行转义,而扩展正则表达式不需要

    二 、|, ?,+是扩展正则独有的

    三、 锚定单词首部和尾部在扩展正则以及正则中都需要加上

  • 相关阅读:
    docker tar 镜像 容器相互转换
    JavaScript执行上下文
    JavaScript 作用域
    原型与原型链
    使用Navicat for Oracle新建表空间、用户及权限赋予
    PL/SQL Developer使用教程(中文)
    一步一步使用bootstrap开发一个博客模板
    How to create a simple blog using ASP.NET MVC
    一个有意思的编程网站
    一个很好的java编程国外网站
  • 原文地址:https://www.cnblogs.com/it-ljm1903/p/10842470.html
Copyright © 2020-2023  润新知