case语句,函数及中断控制,字符串处理

天涯浪子 提交于 2020-01-15 08:23:22

case语句

  • case分支,功能类似if,不如if强大,代码比if精简

case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。

case  变量  in

模式1)

       指令1;;

模式2)

      指令2;;

*)

     指令n

[root@server0 opt]# vim  test03.sh
#!/bin/bash
case  $1 in
t)
  touch $2;;   #创建文件
m)
  mkdir $2;;   #创建目录
r)
  rm  -rf  $2;;   #删除
*)
  echo "请输入t|m|r"
esac

[root@server0 opt]# bash test03.sh t  poi
[root@server0 opt]# ls
poi  rh  test01.sh  test02.sh  test03.sh
[root@server0 opt]# bash test03.sh   m  qwer
[root@server0 opt]# ls
poi  qwer  rh  test01.sh  test02.sh  test03.sh
[root@server0 opt]# bash test03.sh  r  poi 
[root@server0 opt]# bash test03.sh  r  qwer
[root@server0 opt]# ls
rh  test01.sh  test02.sh  test03.sh

使用case编写ndinx工具

1.在真机上/linux-soft/02目录中拷贝到虚拟机

[student@room9pc01 02]$ scp  lnmp_soft.tar.gz root@server0:/opt
2.在虚拟机中释放该tar包,并进入目录拷贝nginx文件到/opt

[root@server0 opt]# cp  lnmp_soft/nginx-1.12.2.tar.gz  .

3.编写一键部署nginx源码包的脚本

[root@server0 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
[root@server0 opt]#  bash  test04.sh 
[root@server0 opt]# cd /usr/local/nginx/sbin/   #运行执行后找到该程序所在目录
[root@server0 sbin]# ./nginx      #执行nginx程序
[root@server0 sbin]# systemctl stop firewall  #关闭防火墙
在真机打开浏览器  访问 172.25.0.11 可以看到欢迎界面

netstat命令可以查看系统中启动的端口信息,该命令常用选项如下:

-n以数字格式显示端口号

-t显示TCP连接的端口

-u显示UDP连接的端口

-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口

-p显示监听端口的服务名称是什么(也就是程序名称)

[root@server0 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
[root@server0 opt]# bash  test05.sh guan   (在真机上测试)
[root@server0 opt]# bash  test05.sh kai    (在真机上测试)
[root@server0 opt]# bash  test05.sh res    (在真机上测试)
[root@server0 opt]# bash  test05.sh  cha
服务已开启
[root@server0 opt]# bash  test05.sh  guan
[root@server0 opt]# bash  test05.sh  cha
服务未开启


[root@server0 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;;

[root@server0 opt]# bash  test05.sh  kai
[root@server0 opt]# bash  test05.sh  kai
[root@server0 opt]# bash  test05.sh  kai
[root@server0 opt]# bash  test05.sh  kai

 

[root@server0 opt]# echo -e "\033[31mqqqqq\033[0m"
qqqqq
[root@server0 opt]# echo -e "\033[32mqqqqq\033[0m"
qqqqq
[root@server0 opt]# echo -e "\033[33mqqqqq\033[0m"
qqqqq
[root@server0 opt]# echo -e "\033[34mqqqqq\033[0m"
qqqqq
[root@server0 opt]# echo -e "\033[44mqqqqq\033[0m"  
qqqqq

 


shell函数

什么是函数?

可以将公共的语句块定义成一个名称,来达到精简脚本的目的

使用函数的好处?

  • 使脚本代码更简洁,增强易读性
  • 提高shell脚本的执行效率

服务脚本中的函数应用

  • 适用于比较复杂的启动/终止控制操作
  • 方便在需要时多次调用

如何定义一个函数

function   函数名{

       命令序列

        ....

}

或者

函数名(){

    命令序列

    .....

  • 调用已定义的函数

格式: 函数名

先定义了才能调用,就好比脚本的"内部命令"

  • 函数传值

格式: 函数名  值1  值2....

传递的值作为函数的"位置参数"

[root@server0 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
[root@server0 sbin]# bash test04.sh
qqqq                                    #我是绿色的
zzzz                                    #我是黄色
ssss                                    #我是蓝色
aaaa                                    #我是高亮红

脚本中断 

类型           含义
break         跳出当前所在的循环体,执行循环体后的语句块
continue     跳过循环体内余下的语句,重新判断条件以决定是否需要执行下一次循环
exit             退出脚本,默认返回值为0
编写脚本,可以帮助用户计算整数的求和

[root@server0 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的倍数

[root@server0 opt]# vim test06.sh
#!/bin/bash
for i in {1..20}
do
        x=$[i%6]
        [ $x  -ne 0  ] && continue        #当$x不等于0,则终止当前循环,继续下一次循环
        echo $i
done
[root@server0 opt]# bash test06.sh
6
12
18


编写脚本,for嵌套

[root@server0 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
[root@server0 opt]# bash test07.sh
XXX
XXX
XXX


字符串处理

1.字符串截取

  • 使用${}表达式,格式:  ${变量名:起始位置:长度}     (起始位置的编号从0开始,可省略)

编写一个脚本,随机截取字符串

[root@server0 opt]# vim test08.sh
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
n=$[RANDOM%62]
echo ${x:n:1}
[root@server0 opt]# bash test08.sh
7
[root@server0 opt]# bash test08.sh
y
[root@server0 opt]# bash test08.sh
J
[root@server0 opt]# bash test08.sh
r
[root@server0 opt]# bash test08.sh
r


编写脚本,随机截取八位密码

[root@server0 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的值
[root@server0 opt]# bash test08.sh
BTfQh0E5
[root@server0 opt]# bash test08.sh
wjpBZPQp
[root@server0 opt]# . test08.sh
wQw6XEBR
[root@server0 opt]# . test08.sh
b8ag5frW


2.字符串替换

  • 使用${}表达式,格式:  替换第1个匹配结果  ${变量名/old/new}
  •                                    替换全部匹配结果  ${变量名//old/new}
  •                                   在一定程度上可以删除某个结果${变量名/old/}

3.字符串删除

使用${}表达式,格式:  ${变量名#  }  从左往右删除
[root@server0 opt]# a=`head -1  /etc/passwd`
[root@server0 opt]# echo $a
root:x:0:0:root:/root:/bin/bash
[root@server0 opt]# echo ${a#root}                 #删除到第一个root
:x:0:0:root:/root:/bin/bash
[root@server0 opt]# echo ${a##*root}               #删除到最后一个root
:/bin/bash
[root@server0 opt]# echo ${a##*/}                  #删除到最后一个/
bash
使用${}表达式,格式: ${变量名%    } 从右往左删除
[root@server0 ~]#  a=`head -1  /etc/passwd`
[root@server0 ~]# echo $a
root:x:0:0:root:/root:/bin/bash         
[root@server0 ~]# echo ${a%bash}                  #删除到第一个bash
root:x:0:0:root:/root:/bin/
[root@server0 ~]# echo ${a%/*}                    #删除到第一个/bash
root:x:0:0:root:/root:/bin
[root@server0 ~]# echo ${a%%/*}                   #删除到最后一个/
root:x:0:0:root:
[root@server0 ~]# echo ${a%%:*}                   #删除到最后一个:
root


 按条件掐头去尾

字符串掐头:  从左向右,最短匹配删除    格式:   ${变量名#*关键词}  
                     从左向右,最长匹配删除    格式:   ${变量名##*关键词}
字符串去尾:  从右向左,最短匹配删除    格式:  ${变量名%关键词*}
                     从右向左,最长匹配删除    格式:  ${变量名%%关键词*}
编写批量修改扩展名的脚本(使用字符串的删除功能)

root@server0 opt]# touch abc{1..10}.txt     #批量创建文件
[root@server0 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
[root@server0 opt]# vim  test09.sh
#!/bin/bash
for i in  `ls *.$1`
do
n=${i%.*}                                    #n是去除了扩展名的文件名
mv  $i  $n.$2                               #将原文件修改为文件名.doc
done
[root@server0 opt]# bash test09.sh    txt   doc
[root@server0 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


编写九九乘法表脚本

[root@server0 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
[root@server0 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 
 


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!