1. shell函数

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

  格式:

    func() {   #指定函数名

    command    #函数体

    }

  

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

#显示文本颜色
[root@localhost ~]# vim test.sh
#!/bin/bash
fun (){
for i in {..}
do
echo -e "\033[${i}mHello World\033[0m"
done
}
fun
:wq
[root@localhost ~]# bash test.sh
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
……
#函数返回值
[root@localhost ~]# vim test1.sh
#!/bin/bash
fun () {
echo ""
return
echo ""
}
fun
[root@localhost ~]# bash test1.sh #return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。
[root@localhost ~]# vim test1.sh
#!/bin/bash
fun () {
echo ""
exit
}
fun
:wq
[root@localhost ~]# bash test1.sh [root@localhost ~]# echo $?
#函数传参
[root@localhost ~]# vim test1.sh
#!/bin/bash
fun () {
echo "Hello $1"
}
fun world
:wq
[root@localhost ~]# bash test1.sh
Hello world

2. shell正则表达式

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

  Shell 正则表达式分为两种:

    基础正则表达式

    扩展正则表达式:扩展的表达式有+、?、| 和()

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

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

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

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

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

  (1)文件目录名===>通配符
       (2)文件内容(字符串,文本【文件】内容)===>正则表达式

以grep工具说明常用正则表达式:

符号

描述

实例

.

一个点.匹配任意单个字符(必须存在)

例子:l..e  
#匹配任意两个

可以表示

love

like

leee

不可以表示的

labcde

le

lee

[root@localhost
~]# cat zhengze

like

love

lect

[root@localhost
~]# cat zhengze | grep "l..e"

like

love

^

匹配前面字符串开头

匹配abc开头的行

[root@localhost
~]# cat zhngze

abc you love me

i love you abc

[root@localhost
~]# cat zhngze | grep "^abc"

abc you love me

$

匹配前面字符串结尾

匹配abc结尾的行

[root@localhost
~]# cat zhngze

abc you love me

i love you abc

[root@localhost
~]# cat zhngze | grep "abc$"

i love you abc

 

过滤掉空行

[root@localhost
~]# cat a

123fsasf12

#空行

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

[root@localhost
~]# cat a | grep -v "^$"#去空行

123fsasf12

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

*

匹配前一个字符的零个或多个

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

[root@localhost
~]# cat t | grep "a*"

abcaa

bcacd

aaabc

cbda

zxcv

[root@localhost
~]# cat t | grep -o "a*"

a

aa

a

aaa

a

a*b 表示b前面有任意个a的情况(可以是0个)

[root@localhost
~]# cat t | grep  "a*b"

abcaa

bcacd

aaabc

cbda

[root@localhost
~]# cat t | grep -o  "a*b"

ab

b

aaab

b

.* 

表示任意长度的任意字符

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

条件:

包含 a 和 b

字母 a 必须在 b前面

[root@localhost
~]# cat t

abcaa

bcacd

aaabc

cbda

zxcv

[root@localhost
~]# cat t | grep "a.*b"

abcaa

aaabc

+(扩展正则)

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

[root@localhost
~]# cat t

abcaacdfabvfab

bcacd

aaabc

cbda

zxcv

[root@localhost
~]# cat t | grep -E "ab+"

abcaacdfabvfab

aaabc

[root@localhost
~]# cat t | egrep "ab+"

abcaacdfabvfab

aaabc

[root@localhost
~]# cat t | grep "ab+"  #要正则

[root@localhost
~]#

?

(扩展正则)

表示其前面的字符出现最多一次的情况(可以0个

匹配ac或c(c前面出现的a为0或多个,ac相连)

[root@localhost
~]# cat t

abcaacdfabvfab

bcacd

aaabc

cbda

zxcv

[root@localhost
~]# cat t | grep "a?c"

[root@localhost
~]# cat t | egrep "a?c"

abcaacdfabvfab

bcacd

aaabc

cbda

zxcv

[ ]

表示范围内的一个字符

[root@localhost
~]# cat a

123fsasf12

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

以a-z开头(字母开头)

[root@localhost
~]# cat a | grep "^[a-z]"

fasfdsadfsa

adasfa12

daf

[ .-.]

匹配中括号中范围内的任意一个字符

匹配所有字母

echo -e
"a\nb\nc" | grep '[a-z]'

[^]

匹配[^字符]之外的任意一个字符

[root@localhost
~]# cat a

123fsasf12

fasfdsadfsa

adasfa12

123ddfs

167dsaf

daf

[root@localhost
~]# cat a | grep "^[^a-z]"

#不以字母开头的文件

123fsasf12

123ddfs

167dsaf

{n}或者{n,}

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

{n,}匹配花括号前面字符至少 n个字符

[root@localhost
~]# cat b

bbbasdfhhf

bb1235sdf

babababba

agdsaf

asdf

[root@localhost
~]# cat b | grep "b\{2\}"

bbbasdfhhf

bb1235sdf

babababba

[root@localhost
~]# cat b | grep "b\{3,\}"

#至少3个

bbbasdfhhf

[root@localhost
~]# cat b | egrep "b{3,}"

bbbasdfhhf

 

规则一:花括号和分组在基础正则中需要加上斜线进行转义,但是在扩展正则中不要加斜线

{n,m}

匹配花括号前面字符至少 n个字符,最多 m 个字符

[root@localhost
~]# cat b | egrep "b{2,3}a"

#a前面至少2个b最多3个b

bbbasdfhhf

babababba

[root@localhost
~]# cat b | egrep "fh{2,}f"

#f和f之间最少2个h

bbbasdfhhf

[root@localhost
~]# cat b | egrep "as{,1}f"

#a到f之间最多1个s

agdsaf

\<

锚定单词首部(单词一般以空格或特殊字符做分隔)

[root@localhost
~]# cat c

df:ceroot:fasdf:rootvdga

agd dsaf rootadg
dagaggd

sfafa
afdarootadf agdag

[root@localhost
~]# cat c | grep "\<root"

#以特殊字符分割,首部为root

df:ceroot:fasdf:rootvdga

agd dsaf rootadg dagaggd

\>

锚定单词尾部(单词一般以空格或特殊字符做分隔)

[root@localhost
~]# cat c | grep "root\>"

#以特殊字符分割,尾部为root

df:ceroot:fasdf:rootvdga

( )

\1  调用前面的第一个分组

[root@localhost
~]# cat d

efdgfd1fasdf1

1aefeeea2dfg

3fdavfdva3fggfdf

33dfagqr23zdfbd

abffsh23sfg

[root@localhost
~]# cat d | egrep "([1-9]).*\1"

#调用前面的第一个数字分组,过滤出一行中有两个相同数字的行

efdgfd1fasdf1

3fdavfdva3fggfdf

33dfagqr23zdfbd

[root@localhost
~]# cat d | egrep "^([1-9]).*\1$"

#调用前面的第一个数字分组,找出行首和行位相同数字的行

1aefeeea2dfg1

 

第二个规则:在单词锚定中和分组调用中,基础正则和扩展正则都必须加斜线

|(扩展正则)

匹配竖杠两边的任意一个

过滤出cat 或者Cat

# grep
"cat|Cat" a.txt

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

3. 总结

1> 正则表达式

  一、字符匹配

  .

  []

  [^]

  二、次数匹配

  *

  \{m,n\}

  三、锚定

  ^

  $

  \<

  \>

  四、分组

   \(\)

    \1

2> 扩展正则表达式

  grep -E

  egrep

  一、字符匹配

  .

  []

  [^]

  二、次数匹配

  *

  {m,n}

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

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

  三、锚定

  ^

  $

  \<

  \>

  四、分组

    ()

    \1

    \2

  五、或

  |

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

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

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

Shell函数和正则表达式的更多相关文章

  1. shell(shell函数、shell正则表达式)

    本章内容 shell函数 shell正则表达式 1.shell函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. 格式: funname () { CMD #函数体 ...

  2. shell脚本三——正则表达式

    shell函数:shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式:fun() { 命令 } Shell ...

  3. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  4. Shell入门教程:Shell函数的返回值

    shell函数返回值一般有3种方式: 1.return语句(默认的返回值) shell函数的返回值可以和其他语言的返回值一样,通过return语句返回. 比如: #!/bin/bash functio ...

  5. (转)Shell函数

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.  函数 ...

  6. 任督二脉之Shell中的正则表达式

    VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...

  7. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  8. Shell函数的简单应用

    Shell函数的简单应用 在脚本内给函数传参: #!/bin/bash . /etc/init.d/functions CheckUrl (){ curl -I -s $ | head - } Che ...

  9. Shell函数语法

    Shell函数语法 定义函数: function   函数名(){ 指令... } 调用函数,方法1: 函数名 调用函数,方法2: 函数名  参数一   参数二 return在函数里面使用会跳出函数并 ...

随机推荐

  1. sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

    问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表.删除表.新增字段.修改字段.删除字段等变化,如果人工检查,数据库表和字段比较多的 ...

  2. bzoj 5496: [2019省队联测]字符串问题【SAM+拓扑】

    有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的: 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SA ...

  3. bzoj 4044: [Cerc2014] Virus synthesis【回文自动机+dp】

    建回文自动机,注意到一个回文串是可以通过一个长度小于等于这个串长度的一半的回文串添上一些字符然后复制得到的,也就是在自动机上向fa走,相当于treedp 每次都走显然会T,记录一个up,指向祖先中最下 ...

  4. NOIp 2015信息传递【tarjan/拓扑/并查集】

    一道好的NOIp题目,在赛场上总能用许多算法A掉.比如这道和关押罪犯. 题目传送门 法一:tarjan在有向图中跑最小环 有人从别人口中得知自己信息,等效于出现了一个环.于是 这就变成了一个有向图ta ...

  5. Jenkins自动化部署——持续交付

    感谢之前带领过我的leader,让我能够知道什么是好的开发方法. 在很早之前就接触过敏捷开发.什么是敏捷开发,简单来说就是让软件可靠地,快速地发布出来的一种开发方法和技巧. 而敏捷开发中有许多的实践, ...

  6. Jmeter安装说明

    本文主要介绍Jmeter工具的安装 一.安装JDK 1.下载jdk,到官网下载jdk,下载jkd1.8即可,地址:http://www.oracle.com/technetwork/java/java ...

  7. C#基础学习4

    流程控制!

  8. webfrom ASP开发基础跟模式

    ASP.NET - .net开发网站应用程序的技术总称 ASP WebForm           MVC   是ASP.NET的两个技术方法 WebForm类似于WinForm,可视化操作 MVC类 ...

  9. 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置

    在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置  ----- 这一步我们告诉了Nhibernate:数据库 ...

  10. 玩ztree的一段代码

    <!DOCTYPE HTML> <html lang="zh" xmlns:th="http://www.thymeleaf.org"> ...