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

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

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

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

(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}:表示严格匹配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

一、字符匹配

.

[]

[^]

二、次数匹配

*

{m,n}

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

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

三、锚定

^

$

\<

\>

四、分组

()

\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
AJDLAJDL
LAJLDJA
JDKAJkjskdjklaskj
lsdjal0dlkakm [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编程(4)的更多相关文章

  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. (转)C# 获取当前路径的7中方法

    //获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; //获取 ...

  2. EXCEL 中数据 批量 填充进 word 中

    工具:Python3.7 需求描述:将EXCEL中 第二行 数据 填在 word 对应位置上,然后保存为 "姓名+任务.docx"文件. 再将EXCEL中 第三行 数据 填在 wo ...

  3. Vue3 + Element ui 后台管理系统

    Vue3 + Element ui  后台管理系统 概述:这是一个用vue3.0和element搭建的后台管理系统界面. 项目git地址: https://github.com/whiskyma/vu ...

  4. VScode+PicGo+Github+jsdelivr使用图床书写Markdown

    本文讲述使用Github作为图床,VScode搭配Picgo插件书写Markdown,并使用jsdelivr进行CDN加速的配置流程. 准备阶段 首先进行以下准备工作,都很简单,不再赘述. 注册Git ...

  5. 使用MSF通过MS17-010获取系统权限

    ---恢复内容开始--- Step1:开启postgresql数据库: /etc/init.d/postgresql start Step2:进入MSF中,搜索cve17-010相关的exp: sea ...

  6. Golang omitempty 的用法

    原文链接:https://blog.csdn.net/skh2015java/article/details/90720692omitempty作用是在json数据结构转换时,当该字段的值为该字段类型 ...

  7. umount 时目标忙解决办法

    [root@node2 ~]# umount /var/lib/ceph/osd/ceph- umount: /var/lib/ceph/osd/ceph-:目标忙. (有些情况下通过 lsof() ...

  8. url_for函数——快速寻找url

    我们已经知道,知道了url就可以找到对应的视图函数,那么现在问题来了,如果我们知道了视图函数,要怎么找到url呢?这时候我们就需要url_for函数了. # coding: utf-8from fla ...

  9. 认证授权:学习OIDC

    前言 上一篇文章介绍了OAuth2.0协议的相关内容,知道OAuth2.0是一个授权协议,无法提供完善的身份认证功能.那么什么来解决身份认证功能呢?——OIDC是一个不错的解决方案.接下来进一步来了解 ...

  10. 终于有架构师用401页PDF+194张图表把设计模式讲明白了

    十几年来,IT 界也发生了翻天覆地的变化,各种开源框架层出不穷,机器学习大兴其道.但是,在面向对象编程中,设计模式的重要性却不曾改变.与以前一样,在大规模的企业系统开发中,Java和C#仍处于主导地位 ...