shell函数

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

格式

func() {   #指定函数名

command    #函数体

}

实例1:

#!/bin/bash

func() {

echo "This is a function."

}

func

# bash test.sh

This is a function.

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

示例 2:函数返回值

#!/bin/bash

func() {

VAR=$((1+1))

return $VAR

echo "This is a function."

}

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 正则表达式分为两种:

基础正则表达式

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

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

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

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

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

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

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

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

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

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

符号

描述

实例

.

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

例子:l..e

可以表示

love

like

leee

不可以表示的

labcde

le

lee

^

匹配前面字符串开头

匹配以 abc 开头的行:

echo -e "abc\nxyz" |grep ^abc

$

匹配前面字符串结尾

匹配以 xyz 结尾的行:

echo -e "abc\nxyz" |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\nabcc\nadd" |grep -E 'ab+'

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

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

?(扩展正则)

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

匹配 ac 或 abc:

echo -e "ac\nabc\nadd" |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\nb\nc" |grep '[a-z]'

[^]

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

匹配 a 或 b:

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

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

'[^;]+$'

^[^]

匹配不是中括号内任意一个字符开头的行

匹配不是#开头的行:

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

{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

# echo "hi,root,iamroot" | grep "\<root\>"

hi,root,iamroot

\>

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

# echo "hi,root,iamroot" | grep "\<root"

hi,root,iamroot

# 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

一、字符匹配

.

[]

[^]

二、次数匹配

*

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

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

三、锚定

^

$

\<

\>

四、分组  ()

\1

\2

五、或  |

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

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

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

Posix字符

描述

[:alnum:]

等效a-zA-Z0-9

[:alpha:]

等效a-zA-Z

[:lower:]

等效a-z

[:upper:]

等效A-Z

[:digit:]

等效0-9

[:space:]

匹配任意空白字符,等效\t\n\r\f\v

[:graph:]

非空白字符

[:blank:]

空格与定位字符

[:cntrl:]

控制字符

[:print:]

可显示的字符

[:punct:]

标点符号字符

[:xdigit:]

十六进制

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

说一下[:space:]

[root@ken ~]# cat test    #文本内容
#!/bin/bash
if [ 1 -eq 1 ];
then echo "yes"
else echo "no"
fi [root@ken ~]# grep '[[:space:]]' test #过滤出包含空格的行,[:space:]括号外面还要再包含一个[]
if [ 1 -eq 1 ];
then echo "yes"
else echo "no" [root@ken ~]# grep ' ' test #也可以使用一个空格来代替[:space:]
if [ 1 -eq 1 ];
then echo "yes"
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

答案:

1.
[root@ken ~]# grep "[A-Z]" /etc/init.d/functions 2.
[root@ken ~]# grep "[^0-9]" /etc/init.d/functions 3.
[root@ken ~]# grep "a.*b" /etc/init.d/functions 4.(匹配不到)
[root@ken ~]# grep "ac\{2,5\}b" /etc/init.d/functions 5.
[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 8.
[root@ken ~]# egrep ".*([0-9]).*\1" /etc/init.d/functions

补充:shell练习题

1. 每一秒钟输出/root下的文件至屏幕

2. 打印出包含某个关键词的文件(关键词执行脚本时接收)

3. 统计系统中以.sh结尾的文件总大小,输出结果以kb为单位

参考答案:

1. 

#!/bin/bash
for file in `ls /root`
do
echo $file
sleep 1
done 2. #!/bin/bash
key=$1
for file in `find / -type f`
do
grep "$key" $file &>/dev/null
if [ $? -eq 0 ];then
echo $file
sleep 1
fi
done 3. #!/bin/bash
sum=0
for size in `find /root -name "*.sh" -exec ls -l {} \; | cut -d " " -f 5`
do
let sum+=$size
done
echo "$((sum/1024))kb

shell脚本 4 函数与正则的更多相关文章

  1. Linux Shell脚本编程-函数

    函数介绍  定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数:  功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程.  注意: ...

  2. Shell脚本之八 函数

    一.函数定义 Linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; ...

  3. shell脚本的函数介绍和使用案例

    #前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同 #简介 .函数也具有别名类似的功能 .函数 ...

  4. Shell脚本(五)函数

    总结下shell中的函数用法 #!/bin/bash function add_v1() { echo "call function add" } function add_v2( ...

  5. Shell脚本学习 - 函数,输入输出重定向,文件

    函数 函数定义 [ function ] funname [()] { action; [return int;] } 定义时可以是function fun(),也可以直接fun(),不带参数 返回值 ...

  6. shell脚本之函数的使用

    把代码封装成函数,相当于造了一个“轮子”,之后就直接重复使用即可. 函数的创建 shell中函数的创建有2种方式 1.使用function关键字 语法 function test { ... } 2. ...

  7. shell脚本,awk结合正则来打印文件里面的内容。

    文件内容如下:key1abc d key2 1.想得到如下结果: abc d 2.想得到如下结果: key1key2

  8. shell脚本中${...}函数的用法总结

    ${...}在字符串中有非常多的用法: 1.${var} 限定变量. 如果一个变量名A是另一个变量名AB的前部分,那么,如果要在AB相连时,要得到A的值,就必须使用${var}限定. 如果变量名不会产 ...

  9. 在shell脚本中使用函数

    转载请标明:http://www.cnblogs.com/winifred-tang94/ 对于在脚本中重复使用的功能模块,可以封装成为函数. shell脚本中函数的定义可以使用如下两种方式: a. ...

随机推荐

  1. Windows 常用命令与快捷键

    1.自选区截图Shift+win+s 2.全屏截图Prtsc 3.活动窗口截图Alt+Prtsc 4.新建文件夹Ctrl + Shift + N 5.返回上级目录Alt + 上方向键 6.后退到上一次 ...

  2. 三种远程部署war包检测

    简介 远程部署漏洞属于服务器.中间件配置问题,攻击者可通过远程部署漏洞获取系统权限,远程部署漏洞经常出现在Tomcat.Jboss.Weblogic等web容器之上. 0x01 ### tomcat部 ...

  3. 开源OA办公系统的“应用市场”,能够为协同办公开拓什么样的“前路”?

    在我们的日常生活中,应用市场这个词,总是与智能手机划上等号,不管使用的是iPhone还是安卓,总会接触到手机上的APP应用市场,我们可以在应用市场中,选择自己所需要的APP应用软件,下载使用后,可以让 ...

  4. Go的数组

    目录 数组 一.数组的定义 1.声明数组 2.初始化设值 3.指定位置设值 4.不指定长度初始化(了解) 二.数组的使用 三.数组的类型 四.数组的长度 五.迭代数组 1.初始化迭代 2.使用rang ...

  5. redis数据结构和对象二

    跳跃表(skiplist) 跳跃表是一种有序数据结构.跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树简单,所有不 ...

  6. Spring-05 使用注解开发

    Spring-05 使用注解开发 使用注解开发 1.项目准备 在spring4之后,想要使用注解形式,必须得要引入aop的包5 <!-- https://mvnrepository.com/ar ...

  7. dubbo-zookeeper quick start

    目录 dubbo快速开始 服务提供者(Service provider) 定义服务接口(Defining service interfaces) 在服务提供方实现接口(Implement interf ...

  8. 【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡

    目录 一.MHA+ProxySQL架构 二.快速搭建MHA环境 2.1 下载MHA镜像 2.2 编辑yml文件,创建MHA相关容器 2.3 安装docker-compose软件(若已安装,可忽略) 2 ...

  9. TextRank算法及生产文本摘要方法介绍

    TextRank 算法是一种用于文本的基于图的排序算法,其基本思想来源于谷歌的 PageRank算法,通过把文本分割成若干组成单元(句子),构建节点连接图,用句子之间的相似度作为边的权重,通过循环迭代 ...

  10. python使用try...except语句处理异常

    try....except语句语法格式: try: <语句> except(异常名称): <语句> 注意在except语句中的括号中的异常名称是可以省略的,当省略时就是全捕捉 ...