Shell编程、part4
本节内容
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 正则表达式分为两种:
- 基础正则表达式
- 扩展正则表达式:扩展的表达式有+、?、| 和()
- 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
- 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。
正则表达式和通配符有本质区别
- 不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符。
- 区别通配符和正则表达式最简单的方法:
(1)文件目录名=>通配符
(2)文件内容(字符串,文本【文件】内容)=>正则表达式
下面是一些常用的正则表达式符号,我们先拿 grep 工具举例说明。
注意:在匹配模式中一定要加上引号
基础正则
- 一个点. 表示含义匹配单个字符且该字符必须存在(相当与通配符中的问号)
例子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:匹配以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:找到所有以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:
[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:
[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的更多相关文章
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- shell编程:定义简单标准命令集
shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...
- Linux Shell编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
- Linux_10------Linux之shell编程------变量
.-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...
- 需要交互的shell编程——EOF(转载)
在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...
- ****CodeIgniter使用cli模式运行,把php作为shell编程
shell简介 在计算机科学中,Shell俗称壳(用来区别于核).而我们常说的shell简单理解就是一个命令行界面,它使得用户能与操作系统的内核进行交互操作. 常见的shell环境有:MS-DOS.B ...
- Shell 编程基础之变量和环境变量
一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...
- Linux Shell编程基础
在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls 显示当前路径下的文件,常用的有 -l 显示长格式 -a 显示所有包括隐 ...
- centos 下建用户 shell编程
useradd 用户名 passwd 用户名 cat /etc/passwd 查看用户信息 删除用户 userdel -r 加一个 -r 表示把用户及用户的主目录都删除 su 切换用户 sud ...
随机推荐
- Kendo UI for jQuery使用教程——使用NPM/NuGet进行安装
[Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...
- 使用Vue做个简单的评论 + localstorage存储
1.引入Vue.js 2.编写代码 代码 <!DOCTYPE html> <html lang="zh"> <head> <meta c ...
- struts2没有打印日志原因和No result defined for action XXXAction and result input
在项目中调用一个action的方法的时候发生了一个错误,但是在catalina.out和配置的log4j都没有打印异常,后来在执行的action中加了logger.error("XXXXX& ...
- Python 练习实例3
Python 练习实例3 题目:一个整数,它加上100后是一个完https://www.xuanhe.net/全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 假设该数为 x. ...
- (转载)Ant自动编译打包android项目
1 Ant自动编译打包android项目 1.1 Ant安装 ant的安装比较简单,下载ant压缩包 http://ant.apache.org (最新的为1.9.3版本),下载之后将其解压 ...
- JSP大文件上传断点续传解决方案
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- TTTTTTTTTTTTT 树的直径 Codeforces Beta Round #14 (Div. 2) D. Two Paths
tiyi:给你n个节点和n-1条边(无环),求在这个图中找到 两条路径,两路径不相交,求能找的两条路径的长度的乘积最大值: #include <iostream> #include < ...
- 学习sklearn聚类使用
学习利用sklearn的几个聚类方法: 一.几种聚类方法 1.高斯混合聚类(mixture of gaussians) 2.k均值聚类(kmeans) 3.密度聚类,均值漂移(mean shift) ...
- Selenium 日期控件处理
在WEB测试时,我们会碰到需要输入日期的情况,如果输入框能直接输入,那最好不过了.但是很多时候,输入框是不可输入的,必须的点击日期控件才行. 现在就来聊聊对日期控件的两种操作方法,我们以12306网站 ...
- Spring boot之全局异常捕捉
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...