学习目标
掌握case语句的基本语法结构
掌握函数的定义以及调用
掌握常用的正则表达式元字符含义
一、case语句
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case var in 定义变量;var代表变量名
pattern 1) 模式1;用|分割多个模式,相当于or
command1 需要执行的语句
;; 两个;号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) default,不满足以上模式,默认执行*)下面的语句
command1
;;
esac esac表示case语句结束
二、函数
shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。
2.1函数定义
函数名()
{
函数体(一堆命令的集合,来实现某个功能)
}
function 函数名()
{
函数体(一堆命令的集合,来实现某个功能)
}
function_name()
{
command
command1
...
}
函数return说明“
1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
2.return默认返回函数中的最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间
3.如果没有return命令,函数将返回最后一个shell的退出值。
2.2应用案例
需求:写一个脚本让用户输入基本信息,性别,年龄,如不输入一直提示输入,最后根据用户的信息输出相对应的内容
思路:
循环直到输入字符串不为空 (该功能可以定义为一个函数,方便下面脚本调用)
根据用户输入信息做出匹配判断 case语句
#! /bin/bash
fun(){
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 in
man)
if [ $age gt 18 -a $age -le 35 ];then
echo "中年大叔"
elif [ $age -gt 35 ];then
echo "保温杯带了吗"
else
echo "年轻有为"
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.exit
EOF
}
menu2()
{
cat <<-EOF
欢迎使用web-server,请选择你要操作的内容:
1.清理日志
2.启动apache
3.重启apache
h.help
q.exit
EOF
}
while true
do
clear
menu1
#用户选择相应的主机
read -p "请选择你需要的主机(h for help):" host
case $host in
1)
ssh root@10.1.1.1
;;
2)
ssh root@10.1.1.2
;;
3)
clear;menu2
read -p "请输入你要操作的内容:" actions
case $actions in
1)
ssh root@10.1.1.1 echo "日志正在清理中"
;;
2)
ssh root@10.1.1.1 service apache start
3)
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:]]+ |