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

2023-10-26

前言

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

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

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

脚本错误范例示范

写一个防止误删除的脚本,当用户要删除某个文件,我们就让用户确认是否删除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. 是不是在删除之前可以发送邮件给管理员,让管理员参与确认是否能够删除

等等。

总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

零基础学员的shell脚本的写作思路详解 的相关文章

随机推荐

  • python二元函数图像在线绘制_“绘图,让科学生动起来”:Python-matplotlib绘图(多元函数拟合-3D绘图专题)...

    作者简介 85后一名分析化学工作者及科学爱好者 深爱着北京的老北京人 爱好运动 科学 旅行 个人微信公众号 科学是什么东东 欢迎关注 搭建python matplotlib绘图平台的四个要素是什么 它们是 python软件主体 pip库管理
  • ReentrantLock 源码分析

    ReentrantLock简单使用demo如下 Lock lock new ReentrantLock lock lock try 业务逻辑 finally lock unlock 注 获取的锁代码要放到try块之外 防止获得锁代码异常 抛
  • Chrome开发者工具详解

    Chrome开发者工具详解 1 Elements Console Sources面板 Chrome开发者工具面板 面板上包含了Elements面板 Console面板 Sources面板 Network面板 Timeline面板 Profi
  • adb MacBook Pro上使用adb命令:Command not found或者每次使用前要source .bash_profile文件

    前言 adb MacBook Pro上使用adb命令报错 Command not found 或者每次使用前要source bash profile文件 一 解决问题1 在根路径配置 bash profile文件 如果没有 touch ba
  • python-面向对象基础-类属性&实例属性-构造&析构

    一 类的定义 class 类名 类体 class Person object pass 二 类中成员的定义 class Person object 属性 name tom age 18 height 180 方法 def eat self
  • C++堆和栈的区别和联系

    2017年09月16日 10 39 33 阅读数 1605 参考博客地址 http blog csdn net hairetz article details 4141043 http blog csdn net handsomesunsh
  • C#学习之ASP.NET概述

    ASP NET的应用 网络应用程序开发 学习ASP NET的优势 易学 设计人员和后台代码人员专注于自己的工作 原因 ASP NET将HTML页面代码和脚本代码分离 高效地创建大规模的网络应用程序 背景 自从互联网的出现 各种网络开发技术层
  • 关于ehcache使用rmi方式实现分布式缓存时遇到的问题

    业务场景 一个架构较老的系统 由于在正式环境中需要搭建集群环境 目前使用echcache来作为缓存 为了减少代码修改 使用了RMI方式来实现集群 使用了被动发现和注册的方式 配置如下
  • Ansible Lookup

    1 文件内容的读取 hosts all vars contents lookup file etc foo txt tasks debug msg the value of foo txt is contents Note 切记读取的是本地
  • 使用gpt绘制奥特曼

    public class Ultraman extends JPanel public void paint Graphics g Color silver new Color 192 192 192 画头 g setColor Color
  • C语言顺序表中删除值为x的元素

    要求时间复杂度为O n 空间复杂度为O 1 实现代码如下 删除线性表中为x的元素 void deleteX SqList L int x int k 0 for i 0 i
  • 全球及中国工业互联网产业运行态势与布局状况调研报告2022-2028年

    全球及中国工业互联网产业运行态势与布局状况调研报告2022 2028年 修订日期 2022年4月 出版单位 鸿晟信合研究院 对接人员 周文文 报告价格 纸质版6500元 电子版6800元 纸质 电子版7000元 有折扣 内容部分有删减 了解
  • 1、网络隧道技术

    网络隧道技术简介 隧道技术 Tunneling 是一类网络协议 它是一种数据包封装技术 它将原始IP包 其报头包含原始发送者和最终目的地 封装在另外一个数据包 称为封装的IP包 的数据净荷中进行传输 使用隧道的原因是在不兼容的网络上传输数据
  • CVE20190708复现

    一 实验环境 基于虚拟机运行 VMware 1 靶机 ip 192 168 8 2 测试机 192 168 8 3 将两个虚拟机设置于同一个网段中 a 在虚拟网络编辑器中 将VMnet0采用桥接模式 并桥接到网线网上 b 设置win7为动态
  • 动态规划浅析

    leetcode53 最大子序和 leetcode62 不同路径 leetcode300 最长递增子序列 动态规划要解决的都是一些问题的最优解 即从很多解决问题的方案中找到最优的一个 当我们在求一个问题最优解的时候 如果可以把这个问题分解成
  • npm install 错误 安装 chromedriver 失败的解决办法

    npm 安装 chromedriver 失败的解决办法 npm 安装 chromedriver 时 偶尔会出错 错误提示类似于 npm ERR chromedriver 2 35 0 install node install js 经分析发
  • cicd 07--构建前后端一体化自动化发布流程

    cicd 07 构建前后端一体化自动化发布流程 1 介绍 2 构建过程 2 1 功能说明 2 2 jenkins gitlab 配置 2 3 测试结果 3 注意事项 4 说明 1 介绍 cicd 04 构建自动化发布流程 介绍了一种通用的自
  • NLP扎实基础3:TF-IDF文本特征提取

    TF IDF简介 TF IDF使用流程 见上图 步骤如下 根据全部语料每个词对应的TF IDF值 每个句子对应全部语料的one hot编码 将TF IDF编码作为特征 Python代码 流程很简单 就不复现了 这里有两个使用的方式 第一种是
  • Flutter中如何强制某个页面横屏

    在很多文章中 提到了Flutter中强制某个页面横屏使用如下代码 SystemChrome setPreferredOrientations DeviceOrientation portraitUp DeviceOrientation po
  • 零基础学员的shell脚本的写作思路详解

    前言 这两天一直再批改学员的脚本作业 大多数学员写的很好 有的学员写的不太好 还有一些还没有入门到学员不知道脚本该咋写 不知道脚本怎么写的学员 绝大多数犯了一个错误 一上来就把脚本想的太复杂了 我们今天单独聊聊这个问题 脚本错误范例示范 写