主要内容:
case语法结构及特点(对Nginx的应用示例)、函数及中断控制(break、continue、exit)、字符串处理(截取、替换、删除、变量初始值定义)
- 补充:grep选项[-q]功能,不输出查询结果,类似&> /dev/null
- 补充:wait命令的作用是等待所有后台进程都结束才结束脚本
一、case分支结构
case 分支结构是一种在编程中常用的控制结构,用于根据变量的值执行不同的代码块。
特点:case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作;如果没有任何值能够匹配,就执行预先设置的默认命令序列(检查变量的实际取值,如果与预设的值相匹配,则执行对应的操作)
case分支的执行流程
- 语法格式:
#!/bin/bash
# 提示用户输入
echo "Enter a value:"
read input_value
# 使用 case 语句进行分支选择
case $input_value in
pattern1)
# 匹配 pattern1 时执行的代码
echo "Input matches pattern1";;
pattern2)
# 匹配 pattern2 时执行的代码
echo "Input matches pattern2";;
pattern3|pattern4)
# 匹配 pattern3 或 pattern4 时执行的代码
echo "Input matches pattern3 or pattern4";;
*)
# 默认情况,即不匹配上述任何模式时执行的代码
echo "Input does not match any pattern";;
esac
解释说明:
echo "Enter a value:": //提示用户输入一个值
read input_value: //读取用户输入并存储在变量 input_value 中
case $input_value in: //开始 case 语句,根据 input_value 的值进行分支选择
pattern1): //如果 input_value 匹配 pattern1,则执行相应代码块
pattern2): //如果 input_value 匹配 pattern2,则执行相应代码块
pattern3|pattern4): //如果 input_value 匹配 pattern3 或 pattern4,则执行相应代码块
*): //默认情况,即 input_value 不匹配上述任何模式时执行代码块
;;: //每个分支的代码块结束时使用 ;; 表示结束
esac: //case 语句的结束标志
示例:
#!/bin/bash
# 提示用户输入
echo "Enter a value:"
read input_value
# 使用 case 语句进行分支选择
case $input_value in
pattern1) # 匹配 pattern1 时执行的代码
echo "Input matches pattern1";;
pattern2) # 匹配 pattern2 时执行的代码
echo "Input matches pattern2";;
pattern3|pattern4) # 匹配 pattern3 或 pattern4 时执行的代码
echo "Input matches pattern3 or pattern4";;
*) # 默认情况,即不匹配上述任何模式时执行的代码
echo "Input does not match any pattern";;
esac
例如:
[root@svr7 opt]# vim test03.sh
#!/bin/bash
case $1 in
1)
echo abc;;
2)
echo xyz;;
*)
echo "a|b"
esac
# 测试:
[root@svr7 opt]# bash test03.sh 1
abc
[root@svr7 opt]# bash test03.sh 2
xyz
[root@svr7 opt]# bash test03.sh 3
a|b
例如:
[root@svr7 opt]# vim test04.sh
#!/bin/bash
case $1 in
t)
touch $2;;
m)
mkdir $2;;
r)
rm -rf $2;;
*)
echo "t|m|r"
esac
# 测试:
[root@svr7 opt]# bash test04.sh t AJ.txt
[root@svr7 opt]# ls
AJ.txt
[root@svr7 opt]# bash test04.sh m AnJ
[root@svr7 opt]# ls
AJ.txt AnJ
[root@svr7 opt]# bash test04.sh r AnJ/
[root@svr7 opt]# ls
AJ.txt
[root@svr7 opt]# bash test04.sh zz
t|m|r
案例:脚本要求能使用redhat、fedora作为控制参数,控制参数通过位置变量$1传入:
- 当用户输入redhat参数,脚本返回fedora;
- 当用户输入fedora参数,脚本返回redhat;
- 当用户输入其他参数,则提示错误信息;
[root@svr5 ~]# vim test.sh
#!/bin/bash
case $1 in
redhat)
echo "fedora";;
fedora)
echo "redhat";;
*) //默认输出脚本用法
echo "用法: $0 {redhat|fedora}"
esac
# 测试:
[root@svr5 ~]# chmod +x test.sh
[root@svr5 ~]# ./test.sh //未提供参数,或提供参数无法识别时,提示正确用法
用法: ./test.sh {redhat|fedora}
[root@svr5 ~]# ./test.sh redhat //确认脚本可以响应redhat控制参数
fedora
[root@svr5 ~]# ./test.sh fedora //确认脚本可以响应fedora控制参数
redhat
案例:编写case脚本实现一键启停Nginx服务器
源码安装Nginx需要提前安装依赖包软件:gcc,make,openssl-devel,pcre-devel
步骤1:将lnmp_soft.tar.gz远程拷贝到工作机192.168.4.7
[root@localhost 桌面]# cd /linux-soft/2/
[root@localhost 2]# scp lnmp_soft.tar.gz root@192.168.4.7:/
root@192.168.4.7's password:
lnmp_soft.tar.gz 100% 87MB 159.3MB/s 00:00
步骤2:工作机检查lnmp_soft.tar.gz并拷贝到/opt目录下
[root@svr7 /]# tar -xf lnmp_soft.tar.gz
[root@svr7 /]# ls lnmp_soft
apache-tomcat-8.0.30.tar.gz nginx-1.17.6.tar.gz vpn
...
[root@svr7 /]# cp lnmp_soft/nginx-1.17.6.tar.gz /opt/
[root@svr7 /]# ls /opt/
nginx-1.17.6.tar.gz
步骤3:编写脚本内容:
[root@svr7 opt]# vim test05.sh //编写脚本
#!/bin/bash
yum -y install gcc make pcre-devel openssl-devel //安装依赖包
tar -xf nginx-1.17.6.tar.gz //在/opt目录下解压tar包释放源代码
cd nginx-1.17.6 //切换到解压后的目录
./configure //配置,不指定安装目录则当前解压后目录配置
make //编译
make install //安装
[root@svr7 opt]# bash test05.sh //执行源码安装编译脚本
Nginx默认安装路径为/usr/local/nginx,该目录下会提供4个子目录,分别如下:
- /usr/local/nginx/conf //配置文件目录
- /usr/local/nginx/html //网站页面目录
- /usr/local/nginx/logs //Nginx日志目录(Nginx程序运行时会开启)
- /usr/local/nginx/sbin //主程序目录