case语句、case分支应用示例、函数及中断控制、字符串截取、替换、删除

1 案例1:中断及退出

1.1 问题

本案例要求编写两个Shell脚本,相关要求如下:

  • 从键盘循环取整数(0结束)并求和,输出最终结果

1.2 方案

通过break、continue、exit在Shell脚本中实现中断与退出的功能。

exit结束循环以及整个脚本

break可以结束整个循环

continue结束本次循环,进入下一次循环

案例如下:

    [root@svr5 ~]# vim  test.sh#!/bin/bashfor  i   in   {1..5}do[  $i  -eq  3 ]&& break #这里将break替换为continue,exit分别测试脚本执行效果       echo $idoneecho "Game Over"

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写求和脚本sum.sh

1)编写脚本文件

    #!/bin/bashx=0while  :   doread -p "请输入一个整数求和(0是结束并输出结果):"   n[ -z $n ] && continue    #如果n是空值则重新进行循环任务[ $n -eq 0 ] && break   #如果n是0则退出循环执行循环后任务let x+=n    #不断的将n的值保存在x里doneecho "总和是$x"

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

2.1 问题

编写脚本,相关要求如下:

  • 要求通过位置变量执行不同任务

2.2 方案

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

case分支的语法结构如下所示:

    case  变量  in模式1)命令序列1 ;;模式2)命令序列2 ;;.. ..*)默认命令序列esac

脚本编写参考如下:

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

3 案例3:编写一键部署软件脚本

3.1 问题

本案例要求编写脚本实现一键部署Nginx软件(Web服务器):

  • 一键源码安装Nginx软件
  • 脚本自动安装相关软件的依赖包

3.2 步骤

实现此案例需要按照如下步骤进行。

1)依赖包

源码安装Nginx需要提前安装依赖包软件gcc,openssl-devel,pcre-devel

步骤一:编写脚本

1)参考脚本内容如下:

    [root@svr5 ~]# vim test.sh#!/bin/bashyum -y install gcc openssl-devel pcre-develtar -xf nginx-1.22.1.tar.gzcd nginx-1.22.1./configuremakemake install

2)确认安装效果

Nginx默认安装路径为/usr/local/nginx,其中sbin目录下放着主程序nginx

主程序命令参数:

    [root@svr5 ~]# /usr/local/nginx/sbin/nginx                #启动服务[root@svr5 ~]# /usr/local/nginx/sbin/nginx    -s stop        #关闭服务

4 案例4:启动脚本

4.1 问题

本案例要求编写Ngin启动脚本,要求如下:

  • 脚本支持start、stop、restart、status
  • 脚本支持报错提示
  • 脚本具有判断是否已经开启或关闭的功能

4.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

脚本通过位置变量$1读取用户的操作指令,判断是start、stop、restart还是status。

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

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

-t显示TCP连接的端口

-u显示UDP连接的端口

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

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

1)参考脚本内容如下:

    [root@svr5 ~]# vim test.sh#!/bin/bashcase $1 instart|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/nignx/sbin/nginx;;status|zt)ss -ntulp |grep -q nginxif [ $? -eq 0 ];thenecho 服务已启动elseecho 服务未启动fi;;*)echo Error;;esac

2)执行测试脚本:

    [root@svr5 ~]# ./test.sh start[root@svr5 ~]# ./test.sh stop[root@svr5 ~]# ./test.sh status[root@svr5 ~]# ./test.sh xyz

5 案例5:使用Shell函数

5.1 问题

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

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

5.2 方案

在Shell脚本中,将一些需重复使用的操作,定义为公共的语句块,即可称为函数。通过使用函数,可以使脚本代码更加简洁,增强易读性,提高Shell脚本的执行效率

1)函数的定义方法

格式1:

    function  函数名 {命令序列.. ..}

格式2:

    函数名() {命令序列.. ..}

2)函数的调用

直接使用“函数名”的形式调用,如果该函数能够处理位置参数,则可以使用“函数名 参数1 参数2 .. ..”的形式调用。

注意:函数的定义语句必须出现在调用之前,否则无法执行。

3) 测试语法格式

    [root@svr5 ~]# a(){                        #定义函数echo abcecho xyz}[root@svr5 ~]# a                            #调用函数

5.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写mycolor.sh脚本

1)任务需求及思路分析

用户在执行时提供2个整数参数,这个可以通过位置变量$1、$2读入。

调用函数时,将用户提供的两个参数传递给函数处理。

颜色输出的命令:echo -e "\033[32mOK\033[0m"。

3X为字体颜色,4X为背景颜色。

2)根据实现思路编写脚本文件

    [root@svr5 ~]# vim mycolor.sh#!/bin/bashcecho() {echo -e "\033[$1m$2\033[0m"}cecho 32 OKcecho 33 OKcecho 34 OKcecho 35 OK[root@svr5 ~]# chmod +x mycolor.sh

3)测试脚本执行效果

    [root@svr5 ~]# ./mycolor.sh

还可以利用函数优化之前的nginx脚本

6 案例6:字符串处理

6.1 问题

本案例要求熟悉字符串的常见处理操作,完成以下任务练习:

  • 参考课上示范操作,完成字符串截取、替换等操作
  • 编写批量修改扩展名脚本

6.2 方案

字符串截取的用法:

  • ${变量名:起始位置:长度}
  • 起始位置从0开始计数

字符串替换的两种用法:

  • 只替换第一个匹配结果:${变量名/old/new}
  • 替换全部匹配结果:${变量名//old/new}

字符串掐头去尾:

  • 从左向右,最短匹配删除:${变量名#*关键词}
  • 从左向右,最长匹配删除:${变量名##*关键词}
  • 从右向左,最短匹配删除:${变量名%关键词*}
  • 从右向左,最长匹配删除:${变量名%%关键词*}

6.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:字符串的截取

1)使用 ${}表达式

格式:${变量名:起始位置:长度}

    [root@proxy opt]# a=abcd[root@proxy opt]# echo ${a:1:2}     #从第二位截取两位bc[root@proxy opt]# echo ${a:0:2}    #从头截取两位ab

一个随机密码的案例

首先实现1个字符的随机产生

    #!/bin/bashx=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789n=$[RANDOM%62]        #得到0~61随机数存在变量n中p=${x:n:1}            #通过截取,将1个随机字符赋值给变量p

然后完善:

    #!/bin/bashx=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789pass=                #使用变量passfor i in {1..8}don=$[RANDOM%62]        p=${x:n:1}pass+=$p            #将随机得到的字符赋值给变量pass        doneecho $pass            #最后喊出,得到8位长度随机字符串

步骤二:字符串的替换

1)只替换第1个子串

格式:${变量名/old/new}

还以前面的phone变量为例,确认原始值:

    [root@svr5 ~]# echo $phone13788768897

将字符串中的第1个8替换为X:

    [root@svr5 ~]# echo  ${phone/8/X}137X8768897

2)替换全部子串

格式:${变量名//old/new}

将phone字符串中的所有8都替换为X:

    [root@svr5 ~]# echo  ${phone//8/X}137XX76XX97

步骤三:字符串的匹配删除

以处理系统默认的账户信息为例,定义变量A:

    [root@svr5 ~]# a=`head -1 /etc/passwd`[root@svr5 ~]# echo $aroot:x:0:0:root:/root:/bin/bash

1)从左向右,最短匹配删除

格式:${变量名#*关键词}

删除从左侧第1个字符到最近的关键词“:”的部分,* 作通配符理解:

    [root@svr5 ~]# echo ${a#*:}x:0:0:root:/root:/bin/bash

2)从左向右,最长匹配删除

格式:${变量名##*关键词}

删除从左侧第1个字符到最远的关键词“:”的部分:

    [root@svr5 ~]# echo $a                      #确认变量a的值root:x:0:0:root:/root:/bin/bash[root@svr5 ~]# echo ${a##*:}/bin/bash

3)从右向左,最短匹配删除

格式:${变量名%关键词*}

删除从右侧最后1个字符到往左最近的关键词“:”的部分,* 做通配符理解:

    [root@svr5 ~]# echo ${a%:*}root:x:0:0:root:/root

4)从右向左,最长匹配删除

格式:${变量名%%关键词*}

删除从右侧最后1个字符到往左最远的关键词“:”的部分:

    [root@svr5 ~]# echo ${a%%:*}root

步骤四:编写批量修改扩展名脚本

可以先用touch abc{01..10}.txt 创建10个文件作为素材

    #!/bin/bashfor i in $(ls *.txt)        #找到所有的txt文件交给for循环don=${i%.*}                    #用去尾的方法删除扩展名mv $i $n.doc                #再将源文件扩展名修改为docdone

7 案例7:字符串初值的处理

7.1 问题

本案例要求编写一个脚本可以创建账户,密码可以自定义也可以使用默认值123456

7.2 方案

通过${var:-初值}判断变量是否存在,决定变量的初始值。

7.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:认识字符串初值的最常见处理方法

1)只取值,${var:-word}

若变量var已存在且非空,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响。

变量值已存在的情况:

    [root@svr5 ~]# XX=11[root@svr5 ~]# echo $XX              #查看原变量值11[root@svr5 ~]# echo ${XX:-123}      #因XX已存在,输出变量XX的值11

 步骤二:

    [root@svr5 ~]# cat /root/test.sh#!/bin/bashread  -p   "请输入用户名:"   user[ -z $user ] && exit                    #如果无用户名,则脚本退出read  -p   "请输入密码:"   passpass=${pass:-123456}                    #如果用户没有输入密码,则默认密码为123456useradd  $userecho "$pass"  | passwd   --stdin   $user

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化 前言 在上…

vue组件间通信

Vue组件之间通信方式有哪些 一、父子组件通讯 1、props,emit 父组件可以通过props给子组件传递变量。子组件可以通过emit派发自定义事件,使父组件可以获得事件函数传递过来的形参。 2、$parent、$children、ref 父组件可以通过 c h i l d r e n 获取…

imgaug库图像增强指南(32):塑造【雪景】效果的视觉魔法

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

我的项目管理工具TaskSaas

这次使用的技术是Python的Django框架,以及Django框架自带的前端模版语法. Open-TaskSaas: 项目、学习管理工具 项目已经开源,但我在此基础上已经开始更新Vue3Springboot版本,也希望喜欢开源和学习的小伙伴共同加入进来! 基本的样式,操作,都从线上环境可以看得到了! 首页 测…

Django(九)

1. 用户登录-Cookie和Session 什么是cookie和session? 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接:一次请求响应之后断开连接,再发请求重新连…

PCB导线阻抗概念

1. 计算公式 https://baijiahao.baidu.com/s?id1750340479004609055&wfrspider&forpc Z087/SQRT(εr1.41)ln[(5.98h)/(0.8wt)] 常规来说阻抗与介电常数成反比,与介质层厚度成正比,与线宽成反比,与铜厚成反比。 Z0:印刷导线的特性阻抗 εr:绝缘…

RK3568笔记十:Zlmediakit交叉编译

若该文为原创文章,转载请注明原文出处。 编译Zlmediakit的主要目的是想实现在RK3568拉取多路RTPS流,并通过MPP硬解码,DRM显示出来。为了实现拉取多路流选择了Zlmediakit,使用FFMEPG也可以,在RV1126上已经验证了可行性。 一、环境…

CPU和GPU的工作原理及区别

CPU(Central Processing Unit)和GPU(Graphics Processing Unit)是计算机系统中的两种主要处理器类型,它们在工作原理和用途上有一些显著的区别。 CPU(中央处理器) 工作原理: 通用…

CEF框架中的一些宏定义(一):CHECK DCHECK

文章目录 CHECK & DCHECKDCHECK_IS_ON 日志相关COMPACT_GOOGLE_LOG_FATALLogMessageLOG_STREAM(FATAL)LAZY_STREAMLogMessageVoidify 在CEF框架中,有很多的宏定义,有必要拿出来说一说,在阅读源码的时候更好的理解。 CHECK & DCHECK …

PyTorch深度学习实战(31)——生成对抗网络(Generative Adversarial Network, GAN)

PyTorch深度学习实战(31)——生成对抗网络 0. 前言1. GAN2. GAN 模型分析3. 利用 GAN 模型生成手写数字小结系列链接 0. 前言 生成对抗网络 (Generative Adversarial Networks, GAN) 是一种由两个相互竞争的神经网络组成的深度学习模型,它由…

Flask框架小程序后端分离开发学习笔记《3》客户端向服务器端发送请求

Flask框架小程序后端分离开发学习笔记《3》客户端向服务器端发送请求 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 一、为什么请求数据需要先编码 #构造一个HTTP请求 http_request GET / HTTP/1.1\r\nhost:{}\r\n\r\n.for…

大语言模型系列-ELMo

文章目录 前言一、ELMo的网络结构和流程二、ELMo的创新点总结 前言 在前文大语言模型系列-word2vec已经提到word2vec的缺点: 为每个词汇表中每个分词静态生成一个对应的词向量表示,没有考虑到语境,因此无法无法处理多义词 ps:先…

Python Web 开发之 Flask 入门实践

导语:Flask 是一个轻量级的 Python Web 框架,广受开发者喜爱。本文将带领大家了解 Flask 的基本概念、搭建一个简单的 Web 项目以及如何进一步扩展功能。 一、Flask 简介 Flask 是一个基于 Werkzeug 和 Jinja2 的微型 Web 框架,它的特点是轻…

JAVA RPC Thrift基操实现与微服务间调用

一、Thrift 基操实现 1.1 thrift文件 namespace java com.zn.opit.thrift.helloworldservice HelloWorldService {string sayHello(1:string username) }1.2 执行命令生成Java文件 thrift -r --gen java helloworld.thrift生成代码HelloWorldService接口如下 /*** Autogene…

MBR扇区修复和GRUB引导修复实验

修复MBR扇区 步骤一:在进行实验之前我们需要新加一块磁盘,并对新加磁盘进行分区处理,用来备份sda磁盘的MBR及分区表信息。(注:在实验中可以不像我如此这么繁琐,一个主分区,并格式化挂载即可&am…

Android 通过adb命令查看应用流量

一. 获取应用pid号 通过adb shell ps | grep 包名 来获取app的 pid号 二. 查看应用流量情况 使用adb shell cat /proc/#pid#/net/dev 命令 来获取流量数据 备注: Recevice: 表示收包 Transmit: 表示发包 bytes: 表示收发的字节数 packets: 表示收发正确的包量…

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)

需求: 1.我们希望玩家的业务在玩家线程执行,无需回调,因此是多线程处理。 2.匹配线程负责匹配逻辑,是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后,需要给玩家发奖修改玩家数…

【GitHub项目推荐--不错的 C 开源项目】【转载】

大学时接触的第一门语言就是 C语言,虽然距 C语言创立已过了40多年,但其经典性和可移植性任然是当今众多高级语言中不可忽视的,想要学好其他的高级语言,最好是先从掌握 C语言入手。 今天老逛盘点 GitHub 上不错的 C语言 开源项目&…

【代码随想录11】239. 滑动窗口最大值 347. 前 K 个高频元素

目录 239. 滑动窗口最大值题目描述做题思路参考代码 347. 前 K 个高频元素题目描述参考代码 239. 滑动窗口最大值 题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每…

详解C语言中`||`的短路机制

在C语言中,逻辑或运算符(||)是一种常用的逻辑运算符,用于组合多个条件表达式。与其他编程语言一样,C语言中的逻辑或运算符具有短路机制,这是一种非常重要的概念,本文将深入解释C语言中的||短路机…