case语句,函数及中断控制,字符串处理
case语句
- case分支,功能类似if,不如if强大,代码比if精简
case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。
case 变量 in
模式1)
指令1;;
模式2)
指令2;;
*)
指令n
[[email protected] opt]# vim test03.sh
#!/bin/bash
case $1 in
t)
touch $2;; #创建文件
m)
mkdir $2;; #创建目录
r)
rm -rf $2;; #删除
*)
echo "请输入t|m|r"
esac
[[email protected] opt]# bash test03.sh t poi
[[email protected] opt]# ls
poi rh test01.sh test02.sh test03.sh
[[email protected] opt]# bash test03.sh m qwer
[[email protected] opt]# ls
poi qwer rh test01.sh test02.sh test03.sh
[[email protected] opt]# bash test03.sh r poi
[[email protected] opt]# bash test03.sh r qwer
[[email protected] opt]# ls
rh test01.sh test02.sh test03.sh
使用case编写ndinx工具
1.在真机上/linux-soft/02目录中拷贝到虚拟机
[[email protected] 02]$ scp lnmp_soft.tar.gz [email protected]:/opt
2.在虚拟机中释放该tar包,并进入目录拷贝nginx文件到/opt
[[email protected] opt]# cp lnmp_soft/nginx-1.12.2.tar.gz .
3.编写一键部署nginx源码包的脚本
[[email protected] opt]# vim test04.sh
#!/bin/bash
yum -y install gcc openssl-devel pcre-devel #安装
tar -xf nginx-1.12.2.tar.gz #释放
cd nginx-1.12.2 #备份目录
./configure
make
make install
[[email protected] opt]# bash test04.sh
[[email protected] opt]# cd /usr/local/nginx/sbin/ #运行执行后找到该程序所在目录
[[email protected] sbin]# ./nginx #执行nginx程序
[[email protected] sbin]# systemctl stop firewall #关闭防火墙
在真机打开浏览器 访问 172.25.0.11 可以看到欢迎界面
netstat命令可以查看系统中启动的端口信息,该命令常用选项如下:
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
[[email protected] opt]# vim test05.sh
#!/bin/bash
case $1 in
kai)
/usr/local/nginx/sbin/nginx;; #开启服务
guan)
/usr/local/nginx/sbin/nginx -s stop;; #关闭服务
res)
/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|res|cha"
esac
[[email protected] opt]# bash test05.sh guan (在真机上测试)
[[email protected] opt]# bash test05.sh kai (在真机上测试)
[[email protected] opt]# bash test05.sh res (在真机上测试)
[[email protected] opt]# bash test05.sh cha
服务已开启
[[email protected] opt]# bash test05.sh guan
[[email protected] opt]# bash test05.sh cha
服务未开启
[[email protected] opt]# bash test05.sh kai
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
脚本kai)加if判断,可以解决上述kai的问题
kai)
netstat -ntulp | grep -q nginx
if [ $? -eq 0 ];then
exit
fi
/usr/local/nginx/sbin/nginx;;
[[email protected] opt]# bash test05.sh kai
[[email protected] opt]# bash test05.sh kai
[[email protected] opt]# bash test05.sh kai
[[email protected] opt]# bash test05.sh kai
[[email protected] opt]# echo -e "\033[31mqqqqq\033[0m"
qqqqq
[[email protected] opt]# echo -e "\033[32mqqqqq\033[0m"
qqqqq
[[email protected] opt]# echo -e "\033[33mqqqqq\033[0m"
qqqqq
[[email protected] opt]# echo -e "\033[34mqqqqq\033[0m"
qqqqq
[[email protected] opt]# echo -e "\033[44mqqqqq\033[0m"
qqqqq
shell函数
什么是函数?
可以将公共的语句块定义成一个名称,来达到精简脚本的目的
使用函数的好处?
- 使脚本代码更简洁,增强易读性
- 提高shell脚本的执行效率
服务脚本中的函数应用
- 适用于比较复杂的启动/终止控制操作
- 方便在需要时多次调用
如何定义一个函数
function 函数名{
命令序列
....
}
或者
函数名(){
命令序列
.....
}
- 调用已定义的函数
格式: 函数名
先定义了才能调用,就好比脚本的"内部命令"
- 函数传值
格式: 函数名 值1 值2....
传递的值作为函数的"位置参数"
[[email protected] opt]# vim test04.sh#!/bin/bash
cecho() { #在函数中定义变量,改变输出参数的颜色
echo -e "\033[$1m$2\033[0m"
}
cecho 32 qqqq
cecho 33 zzzz
cecho 34 ssss
cecho 91 aaaa
[[email protected] sbin]# bash test04.sh
qqqq #我是绿色的
zzzz #我是黄色
ssss #我是蓝色
aaaa #我是高亮红
脚本中断
类型 含义
break 跳出当前所在的循环体,执行循环体后的语句块
continue 跳过循环体内余下的语句,重新判断条件以决定是否需要执行下一次循环
exit 退出脚本,默认返回值为0
编写脚本,可以帮助用户计算整数的求和
[[email protected] opt]# vim test05.sh
#!/bin/bash
x=0
while :
do
read -p "请输入一个数字求和,0是结束" n
[ $n -eq 0 ]&& break #还要继续循环之后的任务,所以要用break
let x+=n
done
echo $x
编写脚本,从1-20中找到6的倍数
[[email protected] opt]# vim test06.sh
#!/bin/bash
for i in {1..20}
do
x=$[i%6]
[ $x -ne 0 ] && continue #当$x不等于0,则终止当前循环,继续下一次循环
echo $i
done
[[email protected] opt]# bash test06.sh
6
12
18
编写脚本,for嵌套
[[email protected] opt]# vim test07.sh
#!/bin/bash
for i in {1..3}
do
for i in {1..3}
do
echo -n "X" #echo -n 不换行输出
done
echo
done
[[email protected] opt]# bash test07.sh
XXX
XXX
XXX
字符串处理
1.字符串截取
- 使用${}表达式,格式: ${变量名:起始位置:长度} (起始位置的编号从0开始,可省略)
编写一个脚本,随机截取字符串
[[email protected] opt]# vim test08.sh
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
n=$[RANDOM%62]
echo ${x:n:1}
[[email protected] opt]# bash test08.sh
7
[[email protected] opt]# bash test08.sh
y
[[email protected] opt]# bash test08.sh
J
[[email protected] opt]# bash test08.sh
r
[[email protected] opt]# bash test08.sh
r
编写脚本,随机截取八位密码
[[email protected] opt]# vim test08.sh
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
for i in {1..8}
do
n=$[RANDOM%62]
pass=${x:n:1}
pass1=$pass1$pass
done
echo $pass1
pass1= #设置pass1的值为空,每次运行后自动还原pass1的值
[[email protected] opt]# bash test08.sh
BTfQh0E5
[[email protected] opt]# bash test08.sh
wjpBZPQp
[[email protected] opt]# . test08.sh
wQw6XEBR
[[email protected] opt]# . test08.sh
b8ag5frW
2.字符串替换
- 使用${}表达式,格式: 替换第1个匹配结果 ${变量名/old/new}
- 替换全部匹配结果 ${变量名//old/new}
- 在一定程度上可以删除某个结果${变量名/old/}
3.字符串删除
使用${}表达式,格式: ${变量名# } 从左往右删除
[[email protected] opt]# a=`head -1 /etc/passwd`
[[email protected] opt]# echo $a
root:x:0:0:root:/root:/bin/bash
[[email protected] opt]# echo ${a#root} #删除到第一个root
:x:0:0:root:/root:/bin/bash
[[email protected] opt]# echo ${a##*root} #删除到最后一个root
:/bin/bash
[[email protected] opt]# echo ${a##*/} #删除到最后一个/
bash
使用${}表达式,格式: ${变量名% } 从右往左删除
[[email protected] ~]# a=`head -1 /etc/passwd`
[[email protected] ~]# echo $a
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# echo ${a%bash} #删除到第一个bash
root:x:0:0:root:/root:/bin/
[[email protected] ~]# echo ${a%/*} #删除到第一个/bash
root:x:0:0:root:/root:/bin
[[email protected] ~]# echo ${a%%/*} #删除到最后一个/
root:x:0:0:root:
[[email protected] ~]# echo ${a%%:*} #删除到最后一个:
root
按条件掐头去尾
字符串掐头: 从左向右,最短匹配删除 格式: ${变量名#*关键词}
从左向右,最长匹配删除 格式: ${变量名##*关键词}
字符串去尾: 从右向左,最短匹配删除 格式: ${变量名%关键词*}
从右向左,最长匹配删除 格式: ${变量名%%关键词*}
编写批量修改扩展名的脚本(使用字符串的删除功能)
[email protected] opt]# touch abc{1..10}.txt #批量创建文件
[[email protected] opt]# ls
abc10.txt abc3.txt abc6.txt abc9.txt nginx-1.12.2 test01.sh test06.sh test09.sh
abc1.txt abc4.txt abc7.txt lnmp_soft nginx-1.12.2.tar.gz test02.sh test07.sh
abc2.txt abc5.txt abc8.txt lnmp_soft.tar.gz rh test05.sh test08.sh
[[email protected] opt]# vim test09.sh
#!/bin/bash
for i in `ls *.$1`
do
n=${i%.*} #n是去除了扩展名的文件名
mv $i $n.$2 #将原文件修改为文件名.doc
done
[[email protected] opt]# bash test09.sh txt doc
[[email protected] opt]# ls
abc10.doc abc3.doc abc6.doc abc9.doc nginx-1.12.2 test01.sh test06.sh test09.sh
abc1.doc abc4.doc abc7.doc lnmp_soft nginx-1.12.2.tar.gz test02.sh test07.sh
abc2.doc abc5.doc abc8.doc lnmp_soft.tar.gz rh test05.sh test08.sh
编写九九乘法表脚本
[[email protected] opt]# vim test10.sh
#!/bin/bash
for i in {1..9}
do
for j in `seq $i`
do
echo -n "${i}x$j=$[i*j] "
done
echo
done
[[email protected] opt]# bash test10.sh
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
上一篇: 【剑指offer阅读】面试题4:二维数组中的查找 python
下一篇: shell脚本截取字符串