- 掌握case语句的基本语法结构
- 掌握函数的定义及调用
- 掌握常用的正则表达式元字符含义
一、case语句
关键词:确认过眼神,你是对的人:couple_with_heart:
- case语句为多重匹配语句
- 如果匹配成功,执行相匹配的命令
1. 语法结构
1 | 说明:pattern表示需要匹配的模式 |
2. 应用案例
㈠ 脚本传不同值做不同事
具体需求:当给程序传入start、stop、restart三个不同参数时分别执行相应命令
1 | #!/bin/env bash |
㈡ 根据用户需求选择做事
具体需求:
脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作
1 | #!/bin/env bash |
㈢ 菜单提示让用户选择需要做的事
具体需求:
模拟一个多任务维护界面;当执行程序时先显示总菜单,然后进行选择后做相应维护监控操作
1 | **********请选择********* |
思路:
- 菜单打印出来
- 交互式让用户输入操作编号,然后做出相应处理
落地实现:
- 菜单打印(分解动作)
1 | #!/bin/env bash |
- 最终实现
1 | #!/bin/bash |
课堂练习:
- 输入一个等级(A-E),查看每个等级的成绩;如:输入A,则显示“90分~100分”,依次类推
- 判断用户输入的字符串,如果是”hello”,则显示”world”;如果是”world”,则显示”hello”,否则提示”请输入hello或者world,谢谢!”
二、函数
1. 什么是函数?
- shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数
- 给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能
2. 如何定义函数?
方法1:
1 | 函数名() |
方法2:
1 | function 函数名() |
函数中return说明:
- return可以结束一个函数。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。
- return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。
- 如果没有return命令,函数将返回最后一个指令的退出状态值。
3. 函数如何调用?
㈠ 当前命令行调用
1 | [root@MissHou shell04]# cat fun1.sh |
㈡ 定义到用户的环境变量中
1 | [root@MissHou shell05]# vim ~/.bashrc |
㈢ 脚本中调用
1 | #!/bin/bash |
4. 应用案例
具体需求:
- 写一个脚本收集用户输入的基本信息(姓名,性别,年龄),如不输入一直提示输入
- 最后根据用户的信息输出相对应的内容
思路:
- 交互式定义多个变量来保存用户信息 姓名、性别、年龄
如果不输一直提示输入
- 循环直到输入字符串不为空 while 判断输入字符串是否为空
- 每个信息都必须不能为空,该功能可以定义为一个函数,方便下面脚本调用
根据用户输入信息做出匹配判断
代码实现:
1 | #!/bin/bash |
扩展延伸:
1 | 描述以下代码含义: |
三、综合案例
1. 任务背景
现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。
2. 具体要求
- 只允许yunwei用户通过跳板机远程连接后台的应用服务器做一些维护操作
- 公司运维人员远程通过yunwei用户连接跳板机时,跳出以下菜单供选择:
1 | 欢迎使用Jumper-server,请选择你要操作的主机: |
- 当用户选择相应主机后,直接免密码登录成功
- 如果用户不输入一直提示用户输入,直到用户选择退出
3. 综合分析
- 将脚本放到yunwei用户家目录里的.bashrc文件里(/shell05/jumper-server.sh)
- 将菜单定义为一个函数[打印菜单],方便后面调用
- 用case语句来实现用户的选择【交互式定义变量】
- 当用户选择了某一台服务器后,进一步询问用户需要做的事情 case…esac 交互式定义变量
- 使用循环来实现用户不选择一直让其选择
- 限制用户退出后直接关闭终端 exit
4. 落地实现
1 | #!/bin/bash |
进一步完善需求
为了进一步增强跳板机的安全性,工作人员通过跳板机访问生产环境,但是不能在跳板机上停留。
1 | #!/bin/bash |
回顾信号:
1 | 1) SIGHUP 重新加载配置 |
四、正则表达式
1. 正则表达式是什么?
正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
支持正则表达式的程序如:locate |find| vim| grep| sed |awk
2. 正则能干什么?
- 匹配邮箱、匹配身份证号码、手机号、银行卡号等
- 匹配某些特定字符串,做特定处理等等
3. 正则当中名词解释
元字符
指那些在正则表达式中具有特殊意义的专用字符,如:点(.) 星(*) 问号(?)等
前导字符
位于元字符前面的字符. abc* aooo.
4. 第一类正则表达式
㈠ 正则中普通常用的元字符
元字符 | 功能 | 备注 |
---|---|---|
. | 匹配除了换行符以外的任意单个字符 | |
* | 前导字符出现0次或连续多次 | |
.* | 任意长度字符 | ab.* |
^ | 行首(以…开头) | ^root |
$ | 行尾(以…结尾) | bash$ |
^$ | 空行 | |
[] | 匹配括号里任意单个字符或一组单个字符 | [abc] |
匹配不包含括号里任一单个字符或一组单个字符 | abc | |
^[] | 匹配以括号里任意单个字符或一组单个字符开头 | ^[abc] |
\^[\^] | 匹配不以括号里任意单个字符或一组单个字符开头 | \^[^abc] |
- 示例文本
1 | # cat 1.txt |
- 举例说明
1 |
㈡ 正则中其他常用元字符
元字符 | 功能 | 备注 |
---|---|---|
\\< | 取单词的头 | |
\> | 取单词的尾 | |
\\< \> | 精确匹配 | |
\\{n\\} | 匹配前导字符连续出现n次 | |
\\{n,\\} | 匹配前导字符至少出现n次 | |
\\{n,m\\} | 匹配前导字符出现n次与m次之间 | |
\( \) | 保存被匹配的字符 | |
\d | 匹配数字(grep -P) | [0-9] |
\w | 匹配字母数字下划线(grep -P) | [a-zA-Z0-9_] |
\s | 匹配空格、制表符、换页符(grep -P) | [\t\r\n] |
举例说明:
1 | 需求:将10.1.1.1替换成10.1.1.254 |
㈢ 扩展类正则常用元字符
丑话说在前面:
我说我比较特殊,你要相信!否则我错给你看:smirk:
grep你要用我,必须加 -E 或者 让你兄弟
egrep
来找我sed你要用我,必须加 -r
扩展元字符 | 功能 | 备注 | |
---|---|---|---|
+ | 匹配一个或多个前导字符 | bo+ 匹配boo、 bo | |
? | 匹配零个或一个前导字符 | bo? 匹配b、 bo | |
\ | 或 | 匹配a或b | |
() | 组字符(看成整体) | (my\ | your)self:表示匹配myself或匹配yourself |
{n} | 前导字符重复n次 | ||
{n,} | 前导字符重复至少n次 | ||
{n,m} | 前导字符重复n到m次 |
举例说明:
1 | # grep "root|ftp|adm" /etc/passwd |
5. 第二类正则
表达式 | 功能 | 示例 |
---|---|---|
[:alnum:] | 字母与数字字符 | [[:alnum:]]+ |
[:alpha:] | 字母字符(包括大小写字母) | [[:alpha:]]{4} |
[:blank:] | 空格与制表符 | [[:blank:]]* |
[:digit:] | 数字 | [[:digit:]]? |
[:lower:] | 小写字母 | [[:lower:]]{4,} |
[:upper:] | 大写字母 | [[:upper:]]+ |
[:punct:] | 标点符号 | [[:punct:]] |
[:space:] | 包括换行符,回车等在内的所有空白 | [[:space:]]+ |
1 | [root@server shell05]# grep -E '^[[:digit:]]+' 1.txt |
6. 正则表达式总结
把握一个原则,让你轻松搞定可恶的正则符号:
- 我要找什么?
- 找数字 [0-9]
- 找字母 [a-zA-Z]
- 找标点符号 [[:punct:]]
- 我要如何找?看心情找
- 以什么为首 ^key
- 以什么结尾 key$
- 包含什么或不包含什么 [abc] \^[abc] [\^abc] \^[\^abc]
- 我要找多少呀?
- 找前导字符出现0次或连续多次 ab*
- 找任意单个(一次)字符 ab.
- 找任意字符 ab.*
- 找前导字符连续出现几次 {n} {n,m} {n,}
- 找前导字符出现1次或多次 go+
- 找前到字符出现0次或1次 go?
五、正则元字符一栏表
元字符:在正则中,具有特殊意义的专用字符,如: 星号(*)、加号(+)等
前导字符:元字符前面的字符叫前导字符
元字符 | 功能 | 示例 | ||
---|---|---|---|---|
* | 前导字符出现0次或者连续多次 | ab* abbbb | ||
. | 除了换行符以外,任意单个字符 | ab. ab8 abu | ||
.* | 任意长度的字符 | ab.* adfdfdf | ||
[] | 括号里的任意单个字符或一组单个字符 | [abc][0-9][a-z] | ||
不匹配括号里的任意单个字符或一组单个字符 | abc | |||
^[] | 匹配以括号里的任意单个字符开头 | ^[abc] | ||
\^ | 不匹配以括号里的任意单个字符开头 | |||
^ | 行的开头 | ^root | ||
$ | 行的结尾 | bash$ | ||
^$ | 空行 | |||
\\{n\\}和{n} | 前导字符连续出现n次 | [0-9]\\{3\\} | ||
\\{n,\\}和{n,} | 前导字符至少出现n次 | [a-z]{4,} | ||
\\{n,m\\}和{n,m} | 前导字符连续出现n-m次 | go{2,4} | ||
\\<\> | 精确匹配单词 | \\ |
||
\(\) | 保留匹配到的字符 | \(hello\) | ||
+ | 前导字符出现1次或者多次 | [0-9]+ | ||
? | 前导字符出现0次或者1次 | go? | ||
\ | 或 | \^root\ | \^ftp | |
() | 组字符 | (hello\ | world)123 | |
\d | perl内置正则 | grep -P \d+ | ||
\w | 匹配字母数字下划线 |