本节内容

1. shell函数

2. shell正则表达式

shell函数

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

格式

func() { #指定函数名

command #函数体

}

实例1:

  1. #!/bin/bash
  2. func() {
  3. echo "This is a function."
  4. }
  5. func
  6. # bash test.sh
  7. This is a function.
  8. # bash test.sh
  9. This is a function.

Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。

示例 2:函数返回值

  1. #!/bin/bash
  2. func() {
  3. VAR=$((1+1))
  4. return $VAR
  5. echo "This is a function."
  6. }
  7. func
  8. echo $?
  9. # bash test.sh
  10. 2

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

示例 3:函数传参

  1. #!/bin/bash
  2. func() {
  3. echo "Hello $1"
  4. }
  5. func world
  6. # bash test.sh
  7. Hello world

通过 Shell 位置参数给函数传参。

shell正则表达式

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

Shell 正则表达式分为两种:

  • 基础正则表达式
  • 扩展正则表达式:扩展的表达式有+、?、| 和()
  1. 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
  2. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。

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

  1. 不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符。
  2. 区别通配符和正则表达式最简单的方法:

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

(2)文件内容(字符串,文本【文件】内容)=>正则表达式

下面是一些常用的正则表达式符号,我们先拿 grep 工具举例说明。

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

基础正则

  1. 一个点. 表示含义匹配单个字符且该字符必须存在(相当与通配符中的问号)
  1. 例子1
  2. [root@ken ~]# cat test
  3. ac
  4. abc
  5. abbc
  6. anmcc
  7. [root@ken ~]# grep a.c test
  8. abc
  9. [root@ken ~]# grep -o a..c test
  10. abbc
  11. anmc
  1. ^ 表示匹配以某个字符开头的行
  1. 例子1:匹配以root开头的行
  2. [root@ken ~]# cat test1
  3. root:x:0:0:root:/root:/bin/bash
  4. bin:x:1:1:bin:/bin:/sbin/nologin
  5. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  6. adm:x:3:4:adm:/var/adm:/sbin/nologin
  7. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  8. sync:x:5:0:sync:/sbin:/bin/sync
  9. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  10. halt:x:7:0:halt:/sbin:/sbin/halt
  11. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  12. operator:x:11:0:operator:/root:/sbin/nologin
  13. [root@ken ~]# grep “^root test1
  14. root:x:0:0:root:/root:/bin/bash
  15. [root@ken ~]# grep “^r test1
  16. root:x:0:0:root:/root:/bin/bash

例子2:找到所有#号开头的行

  1. [root@ken ~]# grep “^#” test1
  2. #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  3. #halt:x:7:0:halt:/sbin:/sbin/halt
  1. $ 表示匹配以什么字符结尾的行

    例子1:找到所有以bash结尾的行
  1. [root@ken ~]# grep bash$ test1
  2. root:x:0:0:root:/root:/bin/bash

例子2:找到所有空白行

  1. [root@ken ~]# vim test1
  2. [root@ken ~]# grep “^$ test1
    • 表示的是匹配前面的一个字符出现0次或者多次

例子1:

  1. [root@ken ~]# cat test | grep -o a*b
  2. ab
  3. ab
  4. b
  5. aab
  6. aaab
  7. aaaaab
  8. b

例子2:

  1. [root@ken ~]# cat test
  2. abc
  3. abbc
  4. aab
  5. aaab
  6. aaaaab
  7. acab
  8. [root@ken ~]# cat test | grep -o a*b
  9. ab
  10. ab
  11. b
  12. aab
  13. aaab
  14. aaaaab
  15. ab

例子3:

  1. [root@ken ~]# cat test
  2. abc
  3. abbc
  4. aab
  5. aaab
  6. aaaaab
  7. acab
  8. [root@ken ~]# grep -o a.*b test
  9. ab
  10. abb
  11. aab
  12. aaab
  13. aaaaab
  14. acab
  1. [] 表示匹配括号内的一个字符

例子1:

  1. [root@ken ~]# cat test | grep -o “[ab]”
  2. a
  3. b
  4. a
  5. b
  6. b
  7. a
  8. a
  9. b
  10. a
  11. a
  12. a

例子2:匹配以字母开头的行

  1. [root@ken ~]# cat test1 | grep “^[a-z]”
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. sync:x:5:0:sync:/sbin:/bin/sync
  8. operator:x:11:0:operator:/root:/sbin/nologin

例子3:

  1. [root@ken ~]# cat test1 | grep “^[a-zA-Z]”
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. Sync:x:5:0:sync:/sbin:/bin/sync
  8. Ooperator:x:11:0:operator:/root:/sbin/nologin

例子4:

  1. [root@ken ~]# cat test1 | grep “^[a-zA-Z0-9]”
  2. root:x:0:0:root:/root:/bin/bash
  3. 3bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. Sync:x:5:0:sync:/sbin:/bin/sync
  8. Ooperator:x:11:0:operator:/root:/sbin/nologin
  1. [] 表示匹配非括号内的行

例子1:

  1. [root@ken ~]# cat test1 | grep “^[^a-z]”
  2. 3bin:x:1:1:bin:/bin:/sbin/nologin
  3. Sync:x:5:0:sync:/sbin:/bin/sync
  4. #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  5. #halt:x:7:0:halt:/sbin:/sbin/halt
  6. $mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  7. Ooperator:x:11:0:operator:/root:/sbin/nologin
  1. 7.锚定 单词首部:\< 特殊字符,空格
  2. 锚定单词尾部: \>

例子1:

  1. [root@ken ~]# cat test1 | grep \<root
  2. root:x:0:0:root:/root:/bin/bash
  3. Ooperootrator:x:11:0:operator:/root:/sbin/nologin

例子2:

  1. [root@ken ~]# cat test1 | grep \<root\>
  2. root:x:0:0:root:/root:/bin/bash
  3. rootooperootrator:x:11:0:operator:/root:/sbin/nologin
  1. 注意:基础正则:中的{}。以及()前面都要加上\
  2. 使用格式:\{\} \(\)
  1. 8. \{m,n\} 表示匹配前面的字符出现至少m次,至多n

例子1:

  1. [root@ken ~]# cat test | grep -o a\{1,2\}b
  2. ab
  3. ab
  4. aab
  5. aab
  6. aab
  7. ab

例子2:

  1. [root@ken ~]# cat test | grep -o a\{1,\}b
  2. ab
  3. ab
  4. aab
  5. aaab
  6. aaaaab
  7. ab
  1. 9. \(\) \1表示的对某个单词进行分组,\1表示对第一个分组进行调用
  2. [root@ken ~]# sed -i s/\(SELINUX=\)disabled/\1enforcing/g /etc/sysconfig/selinux

扩展正则使用:

1.egrep

2.grep -E

10.+ 表示前面的字符出现一次的情况

例子1:

  1. [root@ken ~]# cat test | egrep a+b
  2. abc
  3. abbc
  4. aab
  5. aaab
  6. aaaaab
  7. acab

例子2:

  1. [root@ken ~]# cat test | grep -E a+b
  2. abc
  3. abbc
  4. aab
  5. aaab
  6. aaaaab
  7. acab

11.| 或

例子1:

  1. [root@ken ~]# echo cat jdkajk Cat | grep -E “(cat)|(Cat)”
  2. cat jdkajk Cat

例子2:

  1. [root@ken ~]# echo cat jdkajk Cat | grep -E “(c|C)at
  2. cat jdkajk Cat

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

例子1:

  1. [root@ken ~]# cat test | grep -E -o a?b
  2. b
  3. ab
  4. ab
  5. b
  6. ab
  7. ab
  8. ab
  9. ab

总结

正则表达式

一、字符匹配

  1. .
  2. []
  3. [^]

二、次数匹配

  1. *
  2. \{m,n\}
  3. `

三、锚定

  1. ^
  2. $
  3. \<
  4. \>

四、分组

  1. \(\)
  2. \1

扩展正则表达式

grep -E

egrep

一、字符匹配

  1. .
  2. []
  3. [^]

二、次数匹配

  1. *
  2. {m,n}
  3. + 表示其前面的字符出现最少一次的情况
  4. ?表示其前面的字符出现最多一次的情况

三、锚定

  1. ^
  2. $
  3. \<
  4. \>

四、分组

  1. ()
  2. \1
  3. \2

五、或

  1. |

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

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

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

  1. |                                   Posix字符 |                                          描述 |
  2. | [:alnum:] |  
  3. 等效a-zA-Z0-9
  4. |
  5. | [:alpha:] | 等效a-zA-Z |
  6. | [:lower:] | 等效a-z |
  7. | [:upper:] | 等效A-Z |
  8. | [:digit:] | 等效0-9 |
  9. | [:space:] | 匹配任意空白字符,等效\t\n\r\f\v |
  10. | [:graph:] | 非空白字符 |
  11. | [:blank:] | 空格与定位字符 |
  12. | [:cntrl:] | 控制字符 |
  13. | [:print:] | 可显示的字符 |
  14. | [:punct:] | 标点符号字符 |
  15. | [:xdigit:] | 十六进制 |

注意:使用这些字符的时候需要在外面还要加一个[]括号

说一下[:space:]

[root@ken ~]# cat test #文本内容

  1. #!/bin/bash if [ 1 -eq 1 ];
  2. then echo "yes"
  3. else echo "no"
  4. fi
  5. AJDLAJDL
  6. LAJLDJA
  7. JDKAJkjskdjklaskj
  8. lsdjal0dlkakm
  9. [root@ken ~]# grep '[[:space:]]' test #过滤出包含空格的行,[:space:]

括号外面还要再包含一个[] if [ 1 -eq 1 ];

  1. then echo "yes"
  2. else echo "no" [root@ken ~]# grep ' ' test #也可以使用一个空格来代替[:space:] if [ 1 -eq 1 ];
  3. then echo "yes"
  4. else echo "no"

正则练习

使用文件 /etc/init.d/functions ,下面可能有些部分题目匹配不到符合的情况。

1. 过滤出包含大写字母的行

2. 匹配非数字字符

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

4. 匹配a和b之间有最少2个c最多5个c的行

5. 过滤出以# 为开头,且第二个字符是空格的行

6.过滤出行首和行位字母相同的行

7.过滤出第一个字符是#,且第二个字符串是非空字符,而且结尾是数字的行

8.过滤出一行包含相同数字的行/etc/init.d/functions

答案:

[root@ken ~]# grep "[A-Z]" /etc/init.d/functions

[root@ken ~]# grep "[^0-9]" /etc/init.d/functions

[root@ken ~]# grep "a.*b" /etc/init.d/functions

4.(匹配不到)

[root@ken ~]# grep "ac{2,5}b" /etc/init.d/functions

[root@ken ~]# grep "^#[[:space:]]" /etc/init.d/functions

6.(匹配不到)

[root@ken ~]# grep "^([a-z]).*\1$" /etc/init.d/functions

7.(匹配不到)

[root@ken ~]# grep "#[[:space:]].*[0-9]$" /etc/init.d/functions

[root@ken ~]# egrep ".([0-9]).\1" /etc/init.d/functions

Shell编程、part4的更多相关文章

  1. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  2. shell编程:定义简单标准命令集

    shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...

  3. Linux Shell编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  4. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  5. Linux_10------Linux之shell编程------变量

    .-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...

  6. 需要交互的shell编程——EOF(转载)

    在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...

  7. ****CodeIgniter使用cli模式运行,把php作为shell编程

    shell简介 在计算机科学中,Shell俗称壳(用来区别于核).而我们常说的shell简单理解就是一个命令行界面,它使得用户能与操作系统的内核进行交互操作. 常见的shell环境有:MS-DOS.B ...

  8. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

  9. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  10. centos 下建用户 shell编程

    useradd 用户名 passwd 用户名 cat /etc/passwd  查看用户信息 删除用户 userdel -r   加一个 -r 表示把用户及用户的主目录都删除 su  切换用户 sud ...

随机推荐

  1. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理

    蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...

  2. Python2和Python3中列表推导式的不同

    Python2和Python3中列表推导式的不同 python2 >>> x = 'my girl' >>> lst = [x for x in 'hello'] ...

  3. Git账号Window10系统配置密钥

    Git 拉取 推送 报错 . Window10系统 需要配置Git账号密钥.

  4. SQL server 获取异常

    一.try...... catch 获取异常信息 /*======================================== 相关错误消 息如下: ERROR_NUMBER() 返回错误号. ...

  5. GridView设置右键菜单

    一.控件设定: 1.页面添加ContextMenuStrip控件: 2.ContextMenuStrip添加菜单项: 3.gridControl找到ContextMenuStrip属性,设置成刚添加C ...

  6. JAVA记录 Spring 两大特性

    1.IOC控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  7. CentOS7.2 安装 PHP7.2

    安装源 安装 EPEL 软件包: $ sudo yum install epel-release 安装 remi 源: $ sudo yum install http://rpms.remirepo. ...

  8. 10、堆叠窗口StackedWidget

    新建项目,基类选择QMainWindow,勾选ui 堆叠窗口有三个page,每个page有个label   button处,快捷菜单,转到槽,添加代码 void MainWindow::on_push ...

  9. 需求-java web 能够实现整个文件夹的上传下载吗?

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  10. 缓存区溢出之slmail fuzzing

    这是我们的实验环境 kali 172.18.5.118smtp windows2003  172.18.5.117  pop3 110 smtp 25 本机 172.18.5.114 已经知道slma ...