本节内容

1. shell函数

2. shell正则表达式

shell函数

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

格式

func() { #指定函数名

command #函数体

}

实例1:

#!/bin/bash
func() {
echo "This is a function."
}
func # bash test.sh
This is a function. # 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 工具举例说明。

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

基础正则

  1. 一个点. 表示含义匹配单个字符且该字符必须存在(相当与通配符中的问号)
例子1:
[root@ken ~]# cat test
ac
abc
abbc
anmcc
[root@ken ~]# grep “a.c” test
abc
[root@ken ~]# grep -o “a..c” test
abbc
anmc
  1. ^ 表示匹配以某个字符开头的行
例子1:匹配以root开头的行
[root@ken ~]# cat test1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@ken ~]# grep “^root” test1
root:x:0:0:root:/root:/bin/bash
[root@ken ~]# grep “^r” test1
root:x:0:0:root:/root:/bin/bash

例子2:找到所有#号开头的行

[root@ken ~]# grep “^#” test1
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
  1. $ 表示匹配以什么字符结尾的行

    例子1:找到所有以bash结尾的行
[root@ken ~]# grep “bash$” test1
root:x:0:0:root:/root:/bin/bash

例子2:找到所有空白行

[root@ken ~]# vim test1
[root@ken ~]# grep “^$” test1
    • 表示的是匹配前面的一个字符出现0次或者多次

例子1:

[root@ken ~]# cat test | grep -o “a*b”
ab
ab
b
aab
aaab
aaaaab
b

例子2:

[root@ken ~]# cat test
abc
abbc
aab
aaab
aaaaab
acab [root@ken ~]# cat test | grep -o “a*b”
ab
ab
b
aab
aaab
aaaaab
ab

例子3:

[root@ken ~]# cat test
abc
abbc
aab
aaab
aaaaab
acab [root@ken ~]# grep -o “a.*b” test
ab
abb
aab
aaab
aaaaab
acab
  1. [] 表示匹配括号内的一个字符

例子1:

[root@ken ~]# cat test | grep -o “[ab]”
a
b
a
b
b
a
a
b
a
a
a

例子2:匹配以字母开头的行

[root@ken ~]# cat test1 | grep “^[a-z]”
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
operator:x:11:0:operator:/root:/sbin/nologin

例子3:

[root@ken ~]# cat test1 | grep “^[a-zA-Z]”
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Sync:x:5:0:sync:/sbin:/bin/sync
Ooperator:x:11:0:operator:/root:/sbin/nologin

例子4:

[root@ken ~]# cat test1 | grep “^[a-zA-Z0-9]”
root:x:0:0:root:/root:/bin/bash
3bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Sync:x:5:0:sync:/sbin:/bin/sync
Ooperator:x:11:0:operator:/root:/sbin/nologin
  1. [] 表示匹配非括号内的行

例子1:

[root@ken ~]# cat test1 | grep “^[^a-z]”
3bin:x:1:1:bin:/bin:/sbin/nologin
Sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
$mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
Ooperator:x:11:0:operator:/root:/sbin/nologin
7.锚定 单词首部:\<     特殊字符,空格
锚定单词尾部: \>

例子1:

[root@ken ~]# cat test1 | grep “\<root”
root:x:0:0:root:/root:/bin/bash
Ooperootrator:x:11:0:operator:/root:/sbin/nologin

例子2:

[root@ken ~]# cat test1 | grep “\<root\>”
root:x:0:0:root:/root:/bin/bash
rootooperootrator:x:11:0:operator:/root:/sbin/nologin
注意:基础正则:中的{}。以及()前面都要加上\
使用格式:\{\} \(\)
8. \{m,n\}  表示匹配前面的字符出现至少m次,至多n次

例子1:

[root@ken ~]# cat test | grep -o “a\{1,2\}b”
ab
ab
aab
aab
aab
ab

例子2:

[root@ken ~]# cat test | grep -o “a\{1,\}b”
ab
ab
aab
aaab
aaaaab
ab
9. \(\)   \1表示的对某个单词进行分组,\1表示对第一个分组进行调用

[root@ken ~]# sed -i ‘s/\(SELINUX=\)disabled/\1enforcing/g’ /etc/sysconfig/selinux

扩展正则使用:

1.egrep

2.grep -E

10.+ 表示前面的字符出现一次的情况

例子1:

[root@ken ~]# cat test | egrep “a+b”
abc
abbc
aab
aaab
aaaaab
acab

例子2:

[root@ken ~]# cat test | grep -E “a+b”
abc
abbc
aab
aaab
aaaaab
acab

11.| 或

例子1:

[root@ken ~]# echo “cat jdkajk Cat” | grep -E “(cat)|(Cat)”
cat jdkajk Cat

例子2:

[root@ken ~]# echo “cat jdkajk Cat” | grep -E “(c|C)at”

cat jdkajk Cat

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

例子1:

[root@ken ~]# cat test | grep -E -o “a?b”
b
ab
ab
b
ab
ab
ab
ab

总结

正则表达式

一、字符匹配

.

[]

[^]

二、次数匹配

*

\{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

答案:

[root@ken ~]# grep "[A-Z]" /etc/init.d/functions

[root@ken ~]# grep "[^0-9]" /etc/init.d/functions

[root@ken ~]# grep "a.*b" /etc/init.d/functions

4.(匹配不到)

[root@ken ~]# grep "ac{2,5}b" /etc/init.d/functions

[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

[root@ken ~]# egrep ".([0-9]).\1" /etc/init.d/functions

Shell编程、part4的更多相关文章

  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. iOS的navigationbar设置左边按钮文字

    实例代码: - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Test"]; //以下是主要实现代码 UIBu ...

  2. Python语法汇总

    如果你之前学过任何一门编程语言,因为每种语言的基础语法要做的事情其实基本是相同的,只是表示方式或某些地方稍稍不同,因此在学Python的时候将它与其它你已经掌握的编程语言对比着学,这样学起来更快,效果 ...

  3. 【leetcode】1235. Maximum Profit in Job Scheduling

    题目如下: We have n jobs, where every job is scheduled to be done from startTime[i] to endTime[i], obtai ...

  4. shell学习——关于shell函数库的使用

    shell函数库的理解: 个人理解,shell函数库实质为一个脚本,脚本内包含了多个函数(函数具有普遍适用性). shell函数库的调用: 通过  . /path/lib/file.lib 或者 so ...

  5. 2019春Python程序设计练习3(0402--0408)

    1-1 如a是一个列表,且a[:]与a[::-1]相等,则a中元素按顺序排列构成一个回文. (2分) T         F 1-3 表达式 {1, 3, 2} > {1, 2, 3} 的值为T ...

  6. 在linux安装php

    去www.php.net找下载最新的版本 http://www.php.net/downloads.php 下载解压 # wget  http://cn2.php.net/distributions/ ...

  7. 插入排序,选择排序,冒泡排序等常用排序算法(java实现)

    package org.webdriver.autotest.Study; import java.util.*; public class sort_examp{ public static voi ...

  8. Jmeter(五)关联之正则表达式提取器

    我们在用Jmeter做接口或者性能测试时,经常会碰到第二个请求提交的的参数要从第一个请求返回的参数中获取,而这些参数值并不是固定的,是动态变化的,这种场景就要用到关联 Jmeter提供了一种叫做正则提 ...

  9. Python3学习笔记(十五):常用时间模块time和datetime

    一.time模块 1.时间戳 time.time() :从1970-01-01到至今的秒数 import time print(time.time()) 1529238004.2784646 2.等待 ...

  10. Selenium 加载Chrome/Firefox浏览器配置文件

    Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我们可能需要加载默认配置. 一.Chrome浏览器 1.在Chrome浏览器的地址栏输入:chrome://v ...