shell编程之一(shell通配符,POSIX字符类,正则表达式,子shell介绍,命令替换,进程替换)

POSIX标准将正则分为两类
基本正则
扩展正则

基本正则表达式元字符集合及其意义

基本正则表达式元字符集合及其意义
    元字符 意义                        举例
    *       # 匹配前一个普通字符0次或多次重复        hel*o,可以匹配heo,hello,helllo
    .       # 匹配任意一个字符,或者空格           ..73.,可以匹配45732,4 732
    ^       # 匹配行首,或在[]里面匹配后面字符的非-取反  ^clean,匹配以clean开头的行,[^b-d]表示匹配非b,c,d的字符
    $       # 匹配行尾                nologin$,匹配以nologin结尾的行
    []      # 匹配字符集合              [0123456789],匹配任意一个数字(穷举)

    \       # 转义符,屏蔽一个元字符的特殊意义

    \< \>    # 精确匹配符号              \<this\>,精确匹配this这个单词,不会匹配thiser等

    \{n\}   # 匹配前面字符出现n次       hel\{2\}o,精确匹配l两次,匹配hello
    \{n,\}  # 匹配前面字符至少出现n次   hel\{2,\}o,匹配l至少两次
    \{n,m\} # 匹配前面字符出现n~m次     hel\{2,3\}o匹配l次数为2到3次

基本正则的常见用法
    ^$          # 匹配空行
    ^.$         # 匹配只包含一个字符的行 #注意:空格也算是字符

    []中括号结构 常见用法
    [0-9]       # 匹配任意一个数字(范围)
    [^b-d]      # 匹配除了b到d之间(b,c,d)的任意字符
    [xyz]       # 匹配字符x, y, 或z
    [B-Pk-y]    # 匹配从B到P, 或者从k到y之间的任意一个字符.
    [a-z0-9]    # 匹配任意小写字母或数字
    [Yy][Ee][Ss]        # 能够匹配yes, Yes, YES, yEs等各种组合

扩展正则表达式元字符集合及其意义

扩展正则表达式元字符集合及其意义
    元字符 意义                               举例
    ?   # 匹配前面那个字符0次或者一次            jo?b,可以匹配jb,job,joob
    +   # 匹配前面那个字符1次或多次,与*类似     se+,可以匹配see,seee
    ()  # 表示一个字符集合或用在expr中           re(a|e|d)d,可以匹配read,reed,redd,等价于re[aed]d
    |   # 表示或,匹配一组可选的字符             正则1|正则2|正则3|...

bash的通配符

bash shell本身不支持正则表达式,但shell支持通配,使用正则的是shell命令和工具如sed,grep,awk,

通配元字符及其意义
    元字符 意义                    举例
    *   # 表示任意字符            rm ./*
    ?   # 表示一个任意字符        ls /et?
    ^   # 表示取反                ls /var/log/[a-z]*.[^awk]*匹配任意一个以字母开头,不以awk结尾的日志
    []  # 字符集                  ls /var/log/[a-z]*.log,匹配任意以字符开头的日子文件
    {}  # 表示一组表达式的集合    ls /var/log/{[a-z]*.[^awk]*,[a-z]*.log},满足其中任意一个,是或的关系

通配的常见用法
    cp ifcfg-eth0{,.bak}    # 将网卡文件复制以.bak备份一次,相当于:cp ifcfg-eth0 ifcfg-eth0.bak
    ls -l {b*,c*,*est*}       # 能够匹配b开头,c开头,以及保护est的字符(注意不会只匹配es哦)

POSIX字符类, 格式[:class:],建议引用是用[[ ]]双中括号

    [[:alpha:]]   # 表示字母,等价于[a-zA-Z]
    [[:alnum:]]   # 表示字母和数字,等价于[0-9a-zA-Z]

    [[:lower:]]   # 匹配小写字母
    [[:upper:]]   # 匹配大写字母. 等价于[A-Z]

    [[:digit:]]   # 匹配(十进制)数字. 等价于[0-9]
    [[:xdigit:]]  # 匹配16进制数字. 等价于[0-9A-Fa-f]

    [[:space:]]   # 匹配空白字符(空格和水平制表符)
    [[:blank:]]   # 匹配一个空格或是一个制表符(tab)

    [[:cntrl:]]   # 表示ctrl键

子shell 介绍 (并行场景也是能考虑应用子shell)

#子shell介绍

#什么是子shell:由父shell fork出来的shell

#如何使用子shell:只需要使用括号()即可
    注意:{} 不会启用子shell ,只有()才能启用子shell
    ( command1; command2; )    # 会启用子shell
    { command1; command2; }    # 不会启用子shell

#子shell有什么特点
    1、子shell中的变量不会影响父shell变量
    2、在子shell中切换了目录,不影响父shell的目录(也就是说不需要切回来)

示例:
#!/bin/bash
#注意看变量a被两次赋值,但是相互不影响
a=123
( a=456; echo $a )
echo $a

什么是命令替换

什么是命令替换:
    将一个命令的结果,赋值给另一个变量

命令替换的形式:
    dir_contents=`ls -al`
    dir_contents=$(ls -al)

什么是进程替换

什么是进程替换:
    把一个进程的输出,作为另一个进程的输入(换句话说, 它把一个命令的结果发给了另一个命令)

进程替换的形式:
    >(command)       # 注意>(  之间不能有空格
    <(command)       #
    |               # 这也是一种特殊的 进程替换

示例展示:
    comm <(ls -l) <(ls -al)           # 进程替换可以比较两个不同命令的输出, 甚至能够比较同一个命令不同选项情况下的输出
    diff <(ls /root/test1) <(ls /root/test2)      # 用进程替换来比较两个不同目录的内容(可以查看哪些文件名相同, 哪些文件名不同)
    cat <(ls -l)                 # 等价于 ls -l | cat
    sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin)  # 列出系统3个主要'bin'目录中的所有文件, 并且按文件名进行排序.注意是3个(查一下, 上面就3个圆括号)明显不同的命令输出传递给'sort'.
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/504.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/5/20作者: 辣条①号

目标:网络规划设计师、系统工程师、ceph存储工程师、云计算工程师。 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录