case分支结构
功能类似if,不如if强大,代码比if精简
case 变量 in
模式1)
指令1;;
模式2)
指令2;;
*)
指令n;;
esac
案例1:基于case分支编写脚本
本案例要求编写test.sh脚本,相关要求如下:
- 能使用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
编写Nginx启动脚本
#!/bin/bash
case $1 in
kai)
netstat -ntulp | grep -q nginx
if [ $? -eq 0 ];then
exit
fi
/usr/local/nginx/sbin/nginx
;;
guan)
netstat -ntulp | grep -q nginx
if [ $? -ne 0 ];then
exit
fi
/usr/local/nginx/sbin/nginx -s stop;;
chongqi)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
cha)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && echo "服务已开启" || echo "服务未开启";;
*)
echo "请输入kai,guan,chongqi,cha"
esac
编写部署软件脚本
一键安装Nginx
-一键源码安装Nginx软件
-脚本自动安装相关软件的依赖包
#!/bin/bash
yum -y install gcc openssl-devel pcre-devel make
tar -xf nginx-1.12.2.tar.gz -C /opt
cd /opt/nginx-1.12.2
./configure
make
make install
netstat命令
netstat命令可以查看系统中启动的端口信息,该命令常用选项如下:
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
关于函数的认识
函数:可以将公共的语句定义为一个名称,来达到精简脚本的目的
什么是函数
-在Shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即可成为函数
使用函数的好处
-使用脚本代码更简介,增强易读性
-提高Shell脚本的执行效率
如何定义一个函数
应用示例
目标
创建一个对两个整数求和的加法器
shell版fork炸弹
递归死循环,可迅速耗尽系统资源
改变字体颜色
echo -e "\033[32mABCD\033[0m"
32m 改颜色
\033[0m 取消变色
案例4:编写一个计算器脚本mycolor.sh
- 将颜色输出的功能自定义为函数
- 调用函数,可以自定义输出内容和颜色
- [root@svr5 ~]# vim mycolor.sh
- #!/bin/bash
- cecho() {
- echo -e "\033[$1m$2\033[0m"
- }
- cecho 32 OK
- cecho 33 OK
- cecho 34 OK
- cecho 35 OK
- [root@svr5 ~]# chmod +x mycolor.sh
退出循环的命令
exit 退出脚本
break 终止循环,继续循环之后的任务
continue 终止当前循环,继续下一次循环
示例
目标
从键盘循环取整数(0结束)并求和,输出最总结果
编写脚本,可以帮助用户计算整数的求和
#!/bin/bash
a=0
while :
do
read -p "请输入一个数" b
[ $b -eq 0 ] && break
let a+=b
done
echo $a
编写脚本要求从1~20中找出6的倍数
#!/bin/bash
for i in {1..20}
do
a=$[i%6]
[ $a -ne 0 ] && continue
echo $i
done
输出三行XXX
#!/bin/bash
for i in {1..3}
do
for i in {1..3}
do
echo -n "X"
done
echo
done
字符串截取
字符串的截取方法
使用${}表达式
-格式:${var:起始位置:长度} #编号从0开始
截取一个随机8位密码
#!/bin/bash
a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
for i in {1..8}
do
n=$[RANDOM%62]
pass=${a:n:1}
pass1=$pass1$pass
done
echo $pass1
字符串替换
${变量名/旧/新}
${变量名//旧/新} #全换
字符串删除
${变量名称# } 从左往右删除
echo ${a#root} 删除到第一个root
echo ${a##*root} 删除到最后一个root
${变量名称% } 从右往左删除
echo ${a%bash} 删除第一个bash
echo ${a%/bash} 删除第一个/bash
echo ${a%/*} 删除到第一个/
echo ${a%%/*} 删除到最后第一个/
echo ${a%%:*} 删除到最后一个:
使用字符串删除功能,编写批量修改扩展名
将所有txt文件修改为doc
#!/bin/bash
for i in `ls *.txt`
do
n=${i%.*}
mv $i $n.doc
done
字符串的初值(备用值),变量非空时不使用
${变量名:-}
#!/bin/bahs
read -p "请输入用户名" u
useradd $u
read -p "请输入密码" p
echo ${p:-123456} | passwd --stdin $u
#不输入密码时,密码默认是123456