美文网首页
case语句 、 函数及中断控制 、 字符串处理

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

作者: 秋天丢了李姑娘 | 来源:发表于2021-06-07 19:48 被阅读0次

    一,while循环

    while 条件测试
    do
    执行指令
    done

    如果条件测试成功,就执行下面的指令,然后再回来继续看条件测试能否成功,如果成功就继续执行指令,且可以实现无限循环,一旦发现条件测试失败了,就立刻终止循环


    #!/bin/bash
    while :      //直接写冒号表示永远正确的条件测试
    do
    echo abc
    sleep 0.1  //如果系统执行任务消耗cpu比较多,可以每次稍微休息0.1秒
    done
    

    #!/bin/bash
    n=20
    while [ $n -gt 10 ]    //可以根据条件定义有次数的循环
    do
    echo $n
    let n--     //每次将n减去1
    echo abc
    sleep 0.1
    done
    

    二,case分支,功能类似if,编写时语句比较精简

    case 调用的变量名称 in
    模式1)
    执行指令;;
    模式2)
    执行指令;;
    。。。。
    *)
    执行指令
    esac

    #!/bin/bash
    case $1 in
    t)      #如果$1是t就执行touch任务
        touch $2;;
    m)    #如果$1是m就执行mkdir任务
        mkdir $2;;
    r)     #如果$1是r就执行rm任务
        rm -rf $2;;
    *)
        echo "请输入t"
    esac
    

    编写源码安装nginx脚本:

    [root@svr7 ~]# tar -xf lnmp_soft.tar.gz    //释放软件包,这个软件包是从真机获取的 
    [root@svr7 ~]# cp lnmp_soft/nginx-1.17.6.tar.gz  /opt   //拷贝nginx到opt下
    [root@svr7 ~]# cd  /opt     //回opt写下列脚本
    
    #!/bin/bash
    yum -y install gcc make pcre-devel openssl-devel  #安装依赖
    tar -xf nginx-1.17.6.tar.gz   #释放nginx的tar包
    cd nginx-1.17.6    #进入nginx目录
    ./configure    #配置,此处无需定义安装目录
    make   #编译
    make install   #安装
    
    [root@svr7 ~]#  ls  /usr/local/nginx/     //脚本执行完后查看有四个目录则成功
    [root@svr7 ~]#  systemctl stop httpd    //关闭其他网站服务
    [root@svr7 ~]#  systemctl stop firewalld    //关闭防火墙
    [root@svr7 ~]#  /usr/local/nginx/sbin/nginx    //开启nginx服务
    [root@svr7 ~]#  http://192.168.4.7/     //浏览器访问,可以看到nginx默认页面
    

    使用case分支编写控制nginx服务的脚本:

    #!/bin/bash
    read -p "请输入执行指令:"  a
    case $a in
    start|kai)
        /usr/local/nginx/sbin/nginx;;
    stop|guan)
        /usr/local/nginx/sbin/nginx -s stop;;
    *)
        echo "请输入start|stop"
    esac
    

    netstat 命令可以查询系统启动的端口信息

    -n以数字格式显示端口号
    -t显示TCP连接的端口
    -u显示UDP连接的端口
    -l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
    -p显示监听端口的服务名称是什么(也就是程序名称)

    #!/bin/bash
    read -p "请输入执行指令:"  a
    case $a in
    start|kai)
        /usr/local/nginx/sbin/nginx;;
    stop|guan)
        /usr/local/nginx/sbin/nginx -s stop;;
    restart|cq)
        /usr/local/nginx/sbin/nginx -s stop
        /usr/local/nginx/sbin/nginx;;
    status|zt)
        netstat -ntulp | grep -q nginx
        [ $? -eq 0 ] && echo "nginx正在运行" || echo "nginx未开启";;
    *)
        echo "请输入start|stop"
    esac
    

    echo -e "\033[34mABCD\033[0m"   #使用echo输出不同颜色的内容
    

    三,函数,可以使用名称存储公共的语句块,实现精简脚本方便后期调用的效果

    #!/bin/bash
    a(){     #定义函数,名称是a
    echo abc
    echo xyz
    }
    
    a   #调用函数
    

    利用函数完善之前的脚本,使输出信息时有不同颜色

    #!/bin/bash
    a(){
    echo -e "\033[$1m$2\033[0m"
    }
    read -p "请输入执行指令:"  a
    case $a in
    start|kai)
        /usr/local/nginx/sbin/nginx;;
    stop|guan)
        /usr/local/nginx/sbin/nginx -s stop;;
    restart|cq)
        /usr/local/nginx/sbin/nginx -s stop
        /usr/local/nginx/sbin/nginx;;
    status|zt)
        netstat -ntulp | grep -q nginx
        [ $? -eq 0 ] && a 32 "nginx正在运行" || a 31 "nginx未开启";;
    *)
        echo "请输入start|stop"
    esac
    

    四,循环的控制

    exit 可以终止循环,同时脚本也终止
    break 可以终止循环,继续执行循环后的任务
    continue 终止当前循环,继续下一次循环

    编写脚本,帮助用户进行整数求和,如果用户输入0,就
    终止求和并输出结果

    #!/bin/bash
    x=0
    while :   #while循环后面写冒号代表永远正确可以无限循环
    do
    read -p "请输入一个整数求和(0是结束)"   n
    [ -z $n ] && continue    #如果n是空值则重新进行循环任务
    [ $n -eq 0 ] && break   #如果n是0则退出循环执行循环后任务
    let x+=n    #不断的将n的值保存在x里
    done
    echo "总和是$x"
    

    五,字符串处理

    1,字符串截取

    ${变量名称:截取位置:截取长度}

    a=abcdefg
    echo ${a:5:2}    #从变量的第6位截取,截取2位
    echo ${a:3:3}    #从变量的第4位截取,截取3位
    echo ${a:0:3}    #从变量的第1位截取,截取3位
    echo ${a::3}     #上述的精简写法
    

    编写脚本,可以生成8位随机字符

    #!/bin/bash
    x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    for i in {1..8}    #循环8次 
    do
    n=$[RANDOM%62]     #得到0~61随机数存在变量n中
    k=${x:n:1}     #使用字符串截取得到1个随机字符,存在变量k中
    a=$k$a       #不断往变量a中追加
    done
    echo $a     #喊出最终结果,是一个8位长度的随机字符,可以用作密码
    

    2,字符串替换

    ${变量名称/旧/新}

    [root@svr7 opt]# a=12345
    [root@svr7 opt]# echo ${a/4/6}
    12365
    [root@svr7 opt]# a=1122334455
    [root@svr7 opt]# echo ${a/4/6}
    1122336455
    [root@svr7 opt]# echo ${a//4/6}
    1122336655
    

    3,字符串删除

    ${变量名称#要删除的内容} 从左往右删除 掐头

    ${变量名称%要删除的内容} 从右往左删除 去尾

    a=abcdefghijkl      //定义变量作为素材
    echo ${a#abcdefghij}    //从左往右删除,只留下kl
    echo ${a#*j}    //精简写法,效果同上
    echo ${a#def}   //无法从中间删除
    a=abcdefghijkl
    echo ${a%defghijkl}   //从右往左删除,只留下abc
    echo ${a%d*}    //精简写法,效果同上
    
    a=abcdabcd
    echo ${a#*c}      //从左往右删除到第1个c
    echo ${a##*c}      //从左往右删除到最后1个c
    a=abcdabcd
    echo ${a%c*}     //从右往左删除到第1个c
    echo ${a%%c*}    //从右往左删除到最后1个c
    

    练习:
    1,简述case分支结构。

    2,简述定义一个Shell函数的方法。

    3,简述Shell环境常见的中断及退出控制指令。

    4,使用 while 循环,统计 1+2+3+4...+100的结果。
    提示:可以用一个独立的变量a存放求和的值。

    5,编写脚本,通过 3 个 read 命令读取用户输入的三个任意数字,脚本对输入的三个数字求和输出。

    6, 编写脚本,测试当前用户对/etc/passwd 文件是否具有读、写、执行的权限,让脚本执行结果类似下面的效果。


    参考答案:
    1,简述case分支结构。
    case 变量名 in
    模式1)
    执行指令 ;;
    模式2)
    执行指令 ;;
    *)
    执行指令
    esac

    2,简述定义一个Shell函数的方法。
    函数名() {
    执行指令
    }

    3,简述Shell环境常见的中断及退出控制指令。
    break:跳出当前所在的循环,执行循环之后的语句。
    continue:跳过循环内余下的语句,执行下一次循环。
    exit:退出脚本

    4,使用 while 循环,统计 1+2+3+4...+100的结果。
    提示:可以用一个独立的变量a存放求和的值。

    !/bin/bash

    a=0
    for i in {1..100}
    do
    let a+=i
    done
    echo $a

    5,编写脚本,通过 3 个 read 命令读取用户输入的三个任意数字,脚本对输入的三个数字求和输出。

    !/bin/bash

    read -p "请输入数字" num1
    read -p "请输入数字" num2
    read -p "请输入数字" num3
    echo $[num1+num2+num3]

    6, 编写脚本,测试当前用户对/etc/passwd 文件是否具有读、写、执行的权限,让脚本执行结果类似下面的效果。
    当前用户对/etc/passwd 有读权限
    当前用户对/etc/passwd 有写权限
    当前用户对/etc/passwd 无执行权限

    #!/bin/bash
    file=/etc/passwd
    [ -r /etc/passwd ] && echo "当前用户对$file 有读权限" || echo "当前用户对$file 没有读权限"
    [ -w /etc/passwd ] && echo "当前用户对$file 有写权限" || echo "当前用户对$file 没有写权限"
    [ -x /etc/passwd ] && echo "当前用户对$file 有执行权限" || echo "当前用户对$file 没有执行权限"
    

    相关文章

      网友评论

          本文标题:case语句 、 函数及中断控制 、 字符串处理

          本文链接:https://www.haomeiwen.com/subject/pdhreltx.html