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}:表示严格匹配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)的更多相关文章
- 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 ...
随机推荐
- 关于make及makefile的工作笔记
之前一直是用java的,最近工作中需要在Linux中写一个C++程序,之前的写法很不规范,只有一个CPP.记录一下关于makefile的相关知识 想要完整的了解相关内容,推荐看这本书<程序员的自 ...
- 个人项目(WordCount C语言)
WordCount程序(C语言) Github地址:https://github.com/peter-ye-code/WordCount 一.题目描述 实现一个简单而完整的软件工具(源程序特征统计程序 ...
- 第4篇 Scrum 冲刺博客
1.站立会议 照骗 进度 成员 昨日完成任务 今日计划任务 遇到的困难 钟智锋 重新设计项目执行流程 实现技能 庄诗楷 游戏窗口的制作 制作了开始游戏的界面,感觉还不错 无 易德康 完成所有棋子的移动 ...
- Latex — 写作编译过程中遇到问题记录与总结
最近在训练的时候,又开始用Latex进行写作.碰到了很多问题,将问题进行记录与总结. 一.输出中文的问题 由于写作的时候用的是中文,而之前用的是英文,故碰到的第一个问题就是中文的问题.我之前下的是Wi ...
- 学习一下 JVM (二) -- 学习一下 JVM 中对象、String 相关知识
一.JDK 8 版本下 JVM 对象的分配.布局.访问(简单了解下) 1.对象的创建过程 (1)前言 Java 是一门面向对象的编程语言,程序运行过程中在任意时刻都可能有对象被创建.开发中常用 new ...
- SpringBoot系列——MyBatis-Plus整合封装
前言 MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发.提高效率,但我们并没有直接使用MP的CRUD接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现 ...
- JVM大作业5——指令集
JVM的每一个线程都有一个虚拟机栈,方法调用时,JVM会在虚拟机栈内为该方法创建一个栈帧. 一条线程,只有正在执行的方法对应的栈帧时可活动的,这个栈帧被称为当前栈帧,当前栈帧对应的方法被称为当前方法, ...
- centos6.8上安装部署 jhipster-registry
必备环境:jdk8,git,maven 1.安装nodejs #由于采用编译的方式很容易出现一些意外的惊喜,所以我们这儿直接用yum命令安装 #1.查看nodejs版本(命令中不要加 -y 如果版本不 ...
- 面试中的这些点,你get了吗?
一.前言 因为疫情的原因,小农从七月份开始找工作,到现在已经工作了一个多月了,刚开始找工作的时候,小农也担心出去面试技能不够,要懂的东西很多,自己也准备可能会面试一段时间,从找工作到入职花了十几天,总 ...
- rust 模块组织结构
rust有自己的规则和约定用来组织模块,比如一个包最多可以有一个库crate,任意多个二进制crate.导入文件夹内的模块的两种约定方式... 知道这些约定,就可以快速了解rust的模块系统. 先把一 ...