1. shell函数

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

  格式:

    func() {   #指定函数名

    command    #函数体

    }

  

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

  1. #显示文本颜色
  2. [root@localhost ~]# vim test.sh
  3. #!/bin/bash
  4. fun (){
  5. for i in {..}
  6. do
  7. echo -e "\033[${i}mHello World\033[0m"
  8. done
  9. }
  10. fun
  11. :wq
  12. [root@localhost ~]# bash test.sh
  13. Hello World
  14. Hello World
  15. Hello World
  16. Hello World
  17. Hello World
  18. Hello World
  19. ……
  1. #函数返回值
  2. [root@localhost ~]# vim test1.sh
  3. #!/bin/bash
  4. fun () {
  5. echo ""
  6. return
  7. echo ""
  8. }
  9. fun
  10. [root@localhost ~]# bash test1.sh
  11.  
  12. #return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。
  13. [root@localhost ~]# vim test1.sh
  14. #!/bin/bash
  15. fun () {
  16. echo ""
  17. exit
  18. }
  19. fun
  20. :wq
  21. [root@localhost ~]# bash test1.sh
  22.  
  23. [root@localhost ~]# echo $?
  1. #函数传参
  2. [root@localhost ~]# vim test1.sh
  3. #!/bin/bash
  4. fun () {
  5. echo "Hello $1"
  6. }
  7. fun world
  8. :wq
  9. [root@localhost ~]# bash test1.sh
  10. 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. 当打开一个.h或.cpp文件时, Solution Explorer就自动展开文件所在的目录

    当打开一个.h或.cpp文件时,  Solution Explorer就自动展开文件所在的目录: 如果不想展开: Tools           -> Options           -&g ...

  2. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡【SAM】

    有一个显然的性质就是每个串一定在某个叶子为根的树中是一条直的链 然后因为SAM里是不会有相同状态的,所以以每个叶子为根dfs一遍,并且动态构造SAM(这里的节点u的last指向父亲),最后统计答案就是 ...

  3. 【EXCEL终极总结分享】基于NPOI扩展封装的简易操作工具类库(简单灵活易用,支持导出、导入、上传等常见操作)

    对于EXCEL的导入.导出,我之前已分享过多次,比如: 第一种方案:<我写的一个ExcelHelper通用类,可用于读取或生成数据>这个主要是利用把EXCEL当成一个DB来进行获取数据,导 ...

  4. Luogu P4889 kls与flag 【思维/排序】By cellur925

    题目传送门 这题真的一点也不难qwq.只要想出来就没有什么代码难度的qwq. 每个竹竿只可能向左倒或向右倒,把这两种情况都存在数组中,将数组排序,就可以知道最后落在同一位置的有多少竹竿.就可以知道落在 ...

  5. CSS常见的五大布局

    本文概要 本文将介绍如下几种常见的布局: 一.单列布局 常见的单列布局有两种: header,content 和 footer 等宽的单列布局 header 与 footer 等宽,content 略 ...

  6. python之使用request模块发送post和get请求

    import requestsimport json #发送get请求并得到结果# url = 'http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑马 ...

  7. 513 Find Bottom Left Tree Value 找树左下角的值

    给定一个二叉树,在树的最后一行找到最左边的值. 详见:https://leetcode.com/problems/find-bottom-left-tree-value/description/ C+ ...

  8. 关于ES6的Promise的使用深入理解

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...

  9. Android开发精品收藏贴

    各种下拉刷新效果: https://github.com/scwang90/SmartRefreshLayout

  10. 毕业设计:HomeFragment(一)

    一.主要思路 主要是通过ListView实现. 考虑到以后会添加长按修改功能,所以好几个地方都是用的FramLayout,而且CheckBox初始状态是被隐藏的.给ListView添加OnItemCl ...