当前位置: 首页 > news >正文

shell脚本第五阶段---shell函数与正则表达式

学习目标

掌握case语句的基本语法结构

掌握函数的定义以及调用

掌握常用的正则表达式元字符含义

一、case语句

case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case var in     定义变量;var代表变量名
pattern 1)      模式1;用|分割多个模式,相当于orcommand1      需要执行的语句;;            两个;号代表命令结束
pattern 2)      command2;;
pattern 3)      command3;;*)      default,不满足以上模式,默认执行*)下面的语句command1;;
esac            esac表示case语句结束

二、函数

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

2.1函数定义

函数名()
{函数体(一堆命令的集合,来实现某个功能)}function  函数名()
{函数体(一堆命令的集合,来实现某个功能)
}function_name()
{commandcommand1...
}函数return说明“
1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
2.return默认返回函数中的最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间
3.如果没有return命令,函数将返回最后一个shell的退出值。

2.2应用案例

需求:写一个脚本让用户输入基本信息,性别,年龄,如不输入一直提示输入,最后根据用户的信息输出相对应的内容

思路:

循环直到输入字符串不为空  (该功能可以定义为一个函数,方便下面脚本调用)

根据用户输入信息做出匹配判断  case语句

#! /bin/bashfun(){
read -p "$1" name
if [ -z $name ];then
fun $1
else
echo $name
fi
}#调用函数并且获取用户的姓名,性别,年龄分别赋值给bane,sex,age
name=$(fun 请输入姓名:)
sex=$(fun 请输入性别:)
age=$(fun 请输入年龄:)
echo $name
echo $sex
echo $age#根据用户输入的性别进行匹配判断
case $sex inman)if [ $age gt 18 -a $age -le 35 ];thenecho "中年大叔"elif [ $age -gt 35 ];thenecho "保温杯带了吗"elseecho "年轻有为"fi;;woman)if...fi;;*)....;;

三、综合案例

任务背景:

现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望做一些安全策略来保证跳板机的正常使用。

具体要求:

1.只允许yunwei用户通过跳板机远程链接后台的应用服务器做一些维护操作

2.公司运维人员远程通过yunwei用户连接跳板机时,跳出一下菜单供选择:

欢迎使用Jumper-server,请选择你要操作的主机:
1.DB1-Master
2.DB2-Slave
3.Web1
4.Web2
h.help
q.exit

3.当用户选择相应主机后,直接免密码登录成功
4.如果用户不输入一直提示用户输入,直到用户选择退出

思路:

1.打印菜单-->定义函数  echo cat

2.让用户选择需要操作的机器  case...esac

3.配置免密登录

4.每个菜单提供功能-->case...esac用户选择做的事情

5.循环让用户输入选择

6.每个功能写成函数-->不是必须的

7.脚本放的位置--->yunwei用户的家目录

#! /bin/bash
# jumper-server
#定义函数
#定义菜单打印功能的函数
trap '' 1 2 3 19
menu1()
{
cat <<-EOF
欢迎使用Jumper-server,请选择你要操作的主机:
1.DB1-Master
2.DB2-Slave
3.Web1
4.Web2
h.help
q.exitEOF
}
menu2()
{
cat <<-EOF
欢迎使用web-server,请选择你要操作的内容:
1.清理日志
2.启动apache
3.重启apache
h.help
q.exitEOF
}while true
do
clear
menu1
#用户选择相应的主机
read -p "请选择你需要的主机(h for help):" host
case $host in1)ssh root@10.1.1.1;;2)ssh root@10.1.1.2;;3)clear;menu2read -p "请输入你要操作的内容:" actionscase $actions in1)ssh root@10.1.1.1 echo "日志正在清理中";;2)ssh root@10.1.1.1 service apache start3)ssh root@10.1.1.1 service apache stop;;h)clear;menu2;;*)echo "请选择操作内容";;esac;;h)clear;menu1;;q)exit;;
esac
done

四、正则表达式

1.什么是正则表达式

正则表达式是一种字符模式,用于在查找过程中匹配指定的字符

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。

正则表达式这个概念最初是由unix中的工具软件(例如sed和grep)普及开的。

支持正则表达式的程序如:locate | find | vim | grep | sed | awk

2.第一类正则

名词解释:

元字符:指哪些在正则表达式中具有特殊意义的专用字符,如:点(.)星(*)问号(?)等

前导字符:即位于元字符前面的字符   abc*  aooo.

正则中常用的元字符

(1).   任意单个字符,除了换行符
(2)*   前导字符出现0次或连续多次   ab*能匹配"a","ab"以及"abb",但是不匹配"cb"
(3).*  任意长度的字符  ab.*
(4)^   行的开头
(5)$   行的结尾
(6)^$  空行(7)[]  匹配指定字符组内的任一单个字符  [abc]
(8)[^] 匹配不在指定字符组内的任一字符  [^abc](9)^[] 匹配以指定字符组内的任一字符开头  ^[abc]
(10)^[^]匹配不以指定字符组内的任一字符开头 ^[^abc](11)\<  取单词的头
(12)\>   取单词的尾
(13)\ <\>  精确匹配符号(14)\{n\}  匹配前导字符连续出现n次  go\{2\}  google  gooogle
(15)\{n,\}  匹配前导字符至少出现n次
(16)\{n,m\}  匹配前导字符出现n次与m次之间(17)\(xxx\) 保存被匹配的字符
perl内置正则:
\d  匹配数字  [0-9]
\w  匹配字母数字下划线[a-zA-Z0-9_]
\s  匹配空格、制表符、换页符[\t\r\n]#grep -P '\d' test.txt
#grep -P '\w' test.txt
#grep -P '\s' test.txt

扩展类的正则表达式grep -E或者egrep

扩展正则表达式元字符
+    匹配一个或多个前导字符   bo+  boo bo
?    匹配零个或一个前导字符   bo?  b   bo
a|b  匹配a或b
()   组字符      hello myself  yourself   (my|your)self{n}   前导字符重复n次   \{n\}
{n,}   前导字符至少重复n次    \{n,\}
{n,m}   前导字符重复n到m次   \{n,m\}

3.第二类正则

表达式功能示例
[:alnum:]字母与数字字符[[:alnum:]]+
[:alpha:]字母字符,包括大小写字母[[:alpha:]]{4}
[:blank:]空格与制表符[[:blank:]]*
[:digit:]数字[[:digit:]]?
[:lower:]小写字母[[:lower:]]{4,}
[:upper:]大写字母[[:upper:]]+
[:punct:]标点符号[[:punct:]]
[:space:]包括换行符,回车等在内的所以空白[[:space:]]+

http://www.dtcms.com/a/358524.html

相关文章:

  • 机器学习时间序列算法进行随机划分数据是不合适的!
  • 一键掌控三线资源:极简 Shell 脚本实现 CPU·磁盘·内存可视化巡检
  • 鸿蒙ArkTS 核心篇-14-条件表达式(三目运算符)
  • ans1语法的一个例子nt5inf.cat
  • openEuler2403安装部署PostgreSQL17
  • 开发中使用——鸿蒙CoreSpeechKit让文字发声
  • 118、【OS】【Nuttx】【周边】效果呈现方案解析:作用域?
  • python pyqt5开发DoIP上位机【源码】
  • Spring代理的特点
  • Photoshop - Ps Camera Raw 滤镜
  • 【Python+requests】解决Python requests中的ProxyError:SSL版本错误问题详解
  • C++中的临时对象与移动语义——深入理解与实践
  • 消费 $83,用Claude 实现临床护理系统记录单(所见即所得版)
  • 拦截器Intercepter
  • 基于单片机智能垃圾桶/垃圾分类/语音垃圾桶
  • Spring MVC 参数绑定的默认行为解析
  • MySQL错误1449: The user specified as a definer (‘root‘@‘%‘) does not exist
  • MIT 6.5840 (Spring, 2024) 通关指南——Lab 1: MapReduce
  • JC系列串口通信说明
  • day45-Ansible流程控制
  • 同步/异步日志库
  • 佳易王钟表维修养护管理系统:开启钟表维修高效管理新篇章​就#软件操作教程
  • Compare With Java And Python
  • springboot 实现不同接口指定上传文件大小
  • Linux 定时器:工作原理与实现机制深入分析
  • AI公司是怎样对权重和损失函数做处理的?
  • Oracle下载安装(学习版)
  • 向华为学习——解读73页业务迁移基本流程设计与华为迁移方案【附全文阅读】
  • 计算机三级嵌入式填空题——真题库(26)原题附答案速记
  • Java学习历程17——利用泛型优化自定义动态数组