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

case分支结构

case语句 、 函数及中断控制 、 字符串处理_第1张图片

功能类似if,不如if强大,代码比if精简

case 变量 in

模式1)

   指令1;;

模式2)

   指令2;;

*)

    指令n;;

esac

 

案例1:基于case分支编写脚本

本案例要求编写test.sh脚本,相关要求如下:

  • 能使用redhat、fedora控制参数
  • 控制参数通过位置变量$1传入
  • 当用户输入redhat参数,脚本返回fedora
  • 当用户输入fedora参数,脚本返回redhat
  • 当用户输入其他参数,则提示错误信息
  1. [root@svr5 ~]# vim test.sh
  2. #!/bin/bash
  3. case $1 in
  4. redhat)
  5.         echo "fedora";;
  6. fedora)
  7.         echo "redhat";;
  8.     *)                                             //默认输出脚本用法
  9. echo "用法: $0 {redhat|fedora}"
  10. 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脚本的执行效率

如何定义一个函数

case语句 、 函数及中断控制 、 字符串处理_第2张图片

 

应用示例

目标

创建一个对两个整数求和的加法器

case语句 、 函数及中断控制 、 字符串处理_第3张图片

 

shell版fork炸弹

递归死循环,可迅速耗尽系统资源

case语句 、 函数及中断控制 、 字符串处理_第4张图片

 

 

改变字体颜色

echo -e "\033[32mABCD\033[0m"

32m 改颜色

\033[0m 取消变色

 

案例4:编写一个计算器脚本mycolor.sh

  1. 将颜色输出的功能自定义为函数
  2. 调用函数,可以自定义输出内容和颜色

 

  1. [root@svr5 ~]# vim mycolor.sh
  2. #!/bin/bash
  3. cecho() {
  4. echo -e "\033[$1m$2\033[0m"
  5. }
  6. cecho 32 OK
  7. cecho 33 OK
  8. cecho 34 OK
  9. cecho 35 OK
  10.  
  11. [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

 

你可能感兴趣的:(第二阶段,第二阶段shell编程)