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

发布于:2025-09-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

学习目标

掌握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:]]+