零基础学员的shell脚本的写作思路详解

news2025/1/11 16:59:04

前言

这两天一直再批改学员的脚本作业,大多数学员写的很好,有的学员写的不太好。 还有一些还没有入门到学员不知道脚本该咋写。

不知道脚本怎么写的学员,绝大多数犯了一个错误:一上来就把脚本想的太复杂了。

我们今天单独聊聊这个问题

脚本错误范例示范

写一个防止误删除的脚本,当用户要删除某个文件,我们就让用户确认是否删除Y/N

  1. 若用户输入Y, 表示删除,先备份再删除
  2. 若用户输入N,表示不删除,退出
  3. 若用户输入其他字符,非Y/N,提示用户输入正确的字符。

脚本的写作是遵循演化过程的,这个脚本虽然很简单,但有的学员还是没有思路,没有思路的原因在于,他一直再想,这里应该用if循环,我怎么判断呢? 怎么可以一步到位写出来效果呢?

最后想不出来就参考优秀学员作业,发现优秀学员作业写的更复杂

照着改编一下:
最后写出来的脚本就成了这个样子,(注意,这是个错误示范

脚本中出现了变量但后面没用上,或者没有定义的变量但后面用上了。
在这里插入图片描述

注意: 脚本遵循演化原则,当你还没有具有一步到位写出来的能力的时候,先从最简单的需求写起。

正确写作思路

遵循演化原则:

1. 实现最基础的功能

用户输入文件名,直接删除

#!/bin/bash
read -p "请输入你要删除的文件"  file

rm -rf $file

这样实现的功能是用户不管输入啥文件,我们都给他删掉,用户没有犹豫的机会,接下来我们给用户犹豫的机会,让他考虑是否删除

2. 提示用户是否确认删除

#!/bin/bash
read -p "请输入你要删除的文件"  file
read -p "你是否确认删除文件$file (Y/N)"  YN
rm -rf $file

这一步虽然我们提示用户是否删除,让用户输入Y/N来确定是否删除了,但真正执行的时候,因为没有对Y/N进行判断,导致不管用户输入的是Y/N 都会被删除。

因为脚本是从上往下运行的。

所以我们喜欢判断第三行的变量 $YN, 如果用户输入Y我们就删除,如果用户输入N,我们就不删除。

3. 开始增加判断

#!/bin/bash
  2 read -p "请输入你要删除的文件"  file
  3 read -p "你是否确认删除文件$file (Y/N)"  YN
  4 if [ $YN == Y ]  ;then
  5 echo "正在删除"
  6 rm -rf $file
  7 fi
  8 
  9 if [ $YN == N ];then
 10 echo "请确定好再来,正在退出"
 11 exit
 12 fi

但这样还有一个问题,如果用户输入的既不是Y,也不是N怎么办, 于是我们想到了多分之语句,可以使用多分之语句实现不是Y/N的情况

4. 开始使用多分支语句

 1 #!/bin/bash
  2 read -p "请输入你要删除的文件"  file
  3 read -p "你是否确认删除文件$file (Y/N)"  YN
  4 if [ $YN == Y ]  ;then
  5 echo "正在删除"
  6 rm -rf $file
  7 elif [ $YN == N ];then
  8 echo "请确定好再来,正在退出"
  9 exit
 10 else
 11 echo "请输入正确的字符,比如Y/N"
 12 exit
 13 fi

代码长了之后,没有格式看起来不好看,我们给他加上空格

在这里插入图片描述

到这一步后,我们基本上完成了,用户让用户输入用户名并确认,如果确认的时候我们再删除。

但这里还有个问题,虽然我们提示的是Y/N, 如果用户输入的是y/n 怎么办,接下来我们希望当用户输入小写的时候也能判断。

5. 增加小写也能够判断的情况

在这里插入图片描述

在这个脚本中 -o 表示或者,意思是,$YM =Y或者等于y

这样基本上很完美了,但我们题目中要求我们必须要加备份。也就是确认删除的时候先备份。

6. 增加备份

在这里插入图片描述
增加了方框内的两行,确保在删除的时候,可以提前备份,然后在删除。

这样关于题目当中的内容,我们就全部实现了。

接下来你还可以继续写,比如:

  1. 当前file是文件还是文件夹,是不是可以加个判断。
  2. 如果用户输入的文件名没有怎么办,是不是可以增加应该判断文件是否存在
  3. 在备份的时候是否备份成功怎么确定,是不是可以加上备份是否备份成功的判断
  4. 当前用户是否具有删除的权限,是不是可以判断用户身份,确定当前用户具有删除文件的权限。
  5. 是不是在删除之前可以发送邮件给管理员,让管理员参与确认是否能够删除

等等。

总结

写脚本一定要从小到大,从简单到复杂,遵循演化原则,不要上来就想如何实现全部功能,而是从一个小的功能开始一点点的递进,不断测试,最终完成大的脚本。

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

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

相关文章

以研究用途搭建OpenStreetMap Virtualbox服务器

又到了新年伊始,下载OpenStreetMap全球数据的时候了。结果惊奇的发现,主站已经无法打开。仔细了解了原委,表示理解。好在PBF数据依旧可以获取,只是瓦片服务已经关停。 1.OpenStreetMap的主要问题 OpenStreetMap之所以被Blocked&…

力扣刷题记录——459.重复的字符串、461. 汉明距离、476. 数字的补数

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《459.重复的字符串、461. 汉明距离、476. 数字的补数》。…

Mysql数据库中的表

创建表 和之前的创建库差不多,需要多指定一个engine(不写默认INNODB)这个后面说 字符集还有校对规则不指定的话和库的保持一致 案例 图形化创建就不说了,主要就指令 # 演示关于创建表的操作 # 在db02创建表USER包含id-整形 name…

(9)go-micro微服务Redis配置

文章目录一 go-redis介绍二 go-redis安装三 redis初始化连接四 存储mail邮件五 存储token六 最后一 go-redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库…

【验证码逆向专栏】某验二代滑块验证码逆向分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 本文章未经许可禁止转载…

svn安装与配置并集成

svn安装 客户端安装与下载 下载地址:https://tortoisesvn.net/downloads.zh.html 根据自身设备情况下载 1、更换安装路径,点击next(如果安装路径选择不了那么先点击next在点击back就可以选择安装路径了) 2、如果需要集成idea在下…

详解“陌生的“位段

目录 一、什么是位段? 二、位段的内存分配 三、位段的应用 一、什么是位段? C 语言允许一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为"位段"或"位域"(bit field)…

Golang——异常和error

Go 提供了两种处理错误 方式, 一 种是借助 panic和 recover 的抛出捕获机制, 另一种使用error 错误类型 一、异常 1、go没有try/catch,而是使用panic/recover。 panic包出异常,后续代码不再执行 recover再defer中捕获异常&#x…

c++--stack,queue,priority_queue

前言 对于栈和队列我们是不陌生的,在数据结构阶段已经学习过,记得当时我们还是用c语言将它一步一步造出来,因为压栈与出栈正好满足数组的尾插与头删,数组的代价是及小的。对于队列是头出队列,尾插。所以就栈的实现就用…

React 学习笔记总结(七)

针对React拓展相关的学习。 文章目录一. React 项目打包二. React扩展 之 setState两种写法三. React扩展 之 lazyLoad(懒加载)四、React的 stateHook五、React 的 Effect Hook六、React 的 RefHook七、React 的 Fragment八、React 的 Context九、React 的 PureComponent1. Com…

centos配置网卡自动获取ipv4和ipv6地址

环境&#xff1a; os&#xff1a;centos7 1.背景 正常网卡通过dhcp是不会自动获取ipv6地址的&#xff0c;一般手动执行dhclient -6 <网卡名>可以获取。 现在需求是&#xff1a;实现os启动后自动获取到ipv6地址 2.方法 在网卡对应的配置文件/etc/sysconfig/network-sc…

一、初识Node.js

一、初识Node.js 1.什么是Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 的官网地址&#xff1a; https://nodejs.org/zh-cn/ 2.Node.js中JavaScript运行环境 注意&#xff1a; 浏览器是 JavaScript 的前端运行环境。Node.js 是 JavaScript 的…

The VMware Authorization Service is not running 解决办法

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

ARM惹众怒,美国芯片行业也开始抛弃它,跟随中国芯片支持新架构

ARM曾以为它已经垄断了移动芯片市场&#xff0c;因此可以肆意&#xff0c;甚至还传出计划提高芯片架构授权费的消息&#xff0c;去年还计划限制高通等美国芯片企业自研核心架构&#xff0c;此前它已得罪中国芯片&#xff0c;可以说ARM真正惹了众怒&#xff0c;如此情况下这些芯…

开源文档协作套件CryptPad

本文完成于 2022年 9 月&#xff0c;11月的时候补充了些内容&#xff0c;修改了部分图片&#xff0c;原本是准备发的&#xff0c;不知什么原因又给拖延了&#xff1b; 当时的版是 v5.1.0&#xff0c;而现在最新的版本是 v5.2.1 &#xff1b; 什么是 CryptPad &#xff1f; Cryp…

WEB页面执行shell命令

上面是我的微信和QQ群&#xff0c;欢迎新朋友的加入。1.安装apache服务apt-get install apache22.创建shell脚本cd /var/www/cgi-bin/ vim shell#!/bin/sh alias urldecodesed "s g;s%\\\\xg" | xargs -0 printf "%b" echo "Content-Type: text/html;…

springboot通过controller,dao,service,serviceImpl的基类快速实现各个实体类的增删改查分页等操作

1.pom.xml文件: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/PO…

【1】K8s上部署KubeSphere

目录 1、环境初始化 【1】改名字和主机名解析 【2】时间同步 【3】禁用iptables和firewalld服务&#xff08;三台都要设置&#xff09; 【4】禁用selinux&#xff08;三台都要设置&#xff09; 【5】禁用swap分区 【6】修改linux的内核参数 2、安装docker 【1】安装doc…

化学试剂Silane-PEG-Biotin,硅烷聚乙二醇生物素材料说明

英文名称&#xff1a;Biotin-PEG-Silane 中文名称&#xff1a;生物素-聚乙二醇-硅烷 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k。。。 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff…

RS485 TO ETH (B)无法联网怎么解决?

1 设置下静态IP&#xff0c;例如&#xff1a; RS485 TO ETH (B) 设置为 192.168.1.200 端口号1111&#xff1b; 电脑设置为192.168.1.199 端口号1111&#xff1b; 2 用互联网社区分享的TCP服务器测试下&#xff1a;120.79.100.197 端口号 10002 3 请关闭电脑的所有防火墙&am…