shell脚本 4 函数与正则

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:]

[[email protected] ~]# cat test    #文本内容
#!/bin/bash
if [ 1 -eq 1 ];
then    echo "yes"
else    echo "no"
fi

[[email protected] ~]# grep ‘[[:space:]]‘ test   #过滤出包含空格的行,[:space:]括号外面还要再包含一个[]
if [ 1 -eq 1 ];
then    echo "yes"
else    echo "no"

[[email protected] ~]# 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.
[[email protected] ~]# grep "[A-Z]"  /etc/init.d/functions 

2.
[[email protected] ~]# grep "[^0-9]"  /etc/init.d/functions 

3.
[[email protected] ~]#  grep  "a.*b" /etc/init.d/functions 

4.(匹配不到)
[[email protected] ~]# grep "ac\{2,5\}b" /etc/init.d/functions 

5.
[[email protected] ~]#  grep "^#[[:space:]]" /etc/init.d/functions 

6.(匹配不到)
[[email protected] ~]# grep "^\([a-z]\).*\1$" /etc/init.d/functions 

7.(匹配不到)
[[email protected] ~]# grep  "^#[^[:space:]].*[0-9]$" /etc/init.d/functions 

8.
[[email protected] ~]# 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

原文地址:https://www.cnblogs.com/leeeel/p/10840505.html

时间: 2024-07-29 16:29:12

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

Linux中的shell脚本编程——函数

概述: 本章节将总结while,for循环语句的特殊用法,在不同的场景当中,更能发挥其功能和价值.除此之外,还会介绍一种特殊的循环语句select语句,实现菜单的作用.最重要的是讲解shell脚本编程中函数的用法.这些内容都要熟练掌握. 一.循环语句的特殊用法: 1.while循环的特殊用法(遍历文件的每一行): □语法:while read line; do 循环体 done < /PATH/FROM/SOMEFILE □意义:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将

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

#前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同 #简介 1.函数也具有别名类似的功能 2.函数是把程序里多次调用相同的代码部分定义成一份,然后给这份代码定义个名字,如果出现重复的就调用就行了 #函数的优势 1.把相同的程序段定义成函数,可以减少整个程序的代码量 2.可以让程序代码结构更清晰 3.增加程序的可读.易读性.以及管理性 4.可以实现程序功能模块化,不同的程序使用函数模块化 #语

shell脚本之函数的定义及使用

函数Function的使用 定义函数 1) 函数名称() { ... ... } 2) function 函数名称 { ... ... } 调用函数 函数名称 也可以通过位置变量的方式给函数传递参数 例子: 编写脚本,实现目录管理功能,要求使用函数 #!/bin/bash # createDir() { read -p "Enter directory: " dir if [ -d $dir ]; then echo "目录$dir存在" else mkdir -p

Shell脚本(函数,shell中的数组)

函数 函数就是把一段代码整理到一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式:function f_name(){ command } 函数必须放在最前面,函数名可以自己定义. 案例一: [[email protected] shell]# vim fun.sh #!/bin/bash function inp() { echo $1 $2 $3 $10 ${10} ${11} $0 $# [$*] } inp 1 2 3 4 5 6 7 8 9 3

shell脚本结合函数实现简单计算器功能

#!/bin/bashfunction tool_menu(){    echo "****************************************************"    echo "*                                                  *"    echo "*              calculation  tools                  *"   

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

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

shell脚本之函数的参数

#! /bin/bash echo use function hello() { echo how many parameters in the function:$#; echo the name of this function is $0; echo the first parameters is :$1; echo the second parameters is :$2; } hello "hello" "world" [[email protected]

在shell脚本中使用函数

转载请标明:http://www.cnblogs.com/winifred-tang94/ 对于在脚本中重复使用的功能模块,可以封装成为函数. shell脚本中函数的定义可以使用如下两种方式: a. 函数名() { ······· } b. function 函数名() { ·········· } eg. 结果为: 值得注意的是,如果判断相等哪里想用test指令的话,应该使用如下的格式:

Shell脚本编程入门到放弃

1 区分大小写 UNIX是区分大小写的,因此shell脚本也是区分大小写的 2 特殊字符 UNIX的某些字符都有特殊的意义或功能,如果它们不以其特殊的意义使用必须要进行转义(escaped). 为了转义它们需要用反斜杠或者单引号括起来. 3 shell shell(命令行解释器)是一个能够用来运行命令.程序和shell脚本的环境. 4 shell脚本 shell脚本就是命令的有机组合. shell脚本和函数都是解释型的,ASCII文本,不能被编译. 5 函数 函数的编写和脚本的编写类似,不同之处