欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-10 10:26:57
...

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