Shell编程例题浅谈编程思维

       在这个人工智能火热升温,数据铺天盖地的时代,不得不提一个重要的词—— 编程(programming) 。一提起编程,也是有人欣喜有人忧。当我们拿到一道编程题,我们该如何下手呢?或者当我们想用编程解决实际问题的时候,我们该如何突破呢?下面我从一道我们很熟悉的“跟踪用户输入并交互”这道 Shell编程 例题来简单谈一谈 编程思维 ,希望对你有所启发。

Shell编程例题

Shell编程例题
       首先看到这道题,你的第一反应是什么呢?哇,这么多内容,这怕需要好久才能解决吧。哈哈,是不是被我猜中了,但是我告诉你的是不要慌,有很多东西看起来就是纸老虎。我们首先要做的就是端正心态,相信我们自己,相信我们可以很好的解决它。当你能做到很从容的时候,你也就成功一半了。
       接下来我要说的一个词,叫做编程框架。这个题的编程框架是什么呢?看最后要求,“完成每一个小的任务以后,再次回到上面的菜单,提示用户输入,直到用户输入F(f)退出”。这句话其实是很有用的,这告诉我们不管遇到什么问题,我们都要善于挖掘隐藏信息。当你读到这句话的意思的时候,你就知道了总体框架是一个while循环或者是一个if判断。而这个时候你的整体框架就已经出来了,我第一次就是在脚本上打出了一个循环结构,然后打出了菜单的基本框架。

#!/bin/bash
while :
#[ $letter!=F ]||[ $letter!=f ]  
do
	clear
    echo '----------------------------------------------------------------------------------------'
    echo -e #换行
    echo "User name:$(whoami)   Date:$(date)" #获得登录用户名和日期
    echo -e 
    echo '----------------------------------------------------------------------------------------'
    echo -e 
    echo 'A(a):copy B(b):list directory C(c):delete D(d):creat file E(e):creat directory F(f):exit'
    echo -e 
    echo '----------------------------------------------------------------------------------------'
    echo 'Please enter different options to get the appropriate functionality:'
done

       接下来再分析一下题,看到有很多输入,每一个输入对应一个功能,我们就很容易想到了下面的两个东西,那么你是喜欢用if组合还是case语句呢?随后我们就敲出read letter来读取用户的输入,并敲出了一段case框架来供变量选择。

read letter
case $letter in
	A|a) 
         ;;
	B|b) 
         ;;
    C|c) 
         ;;
    D|d) 
         ;;
    E|e)
         ;;
    F|f) 
         ;;
      *) 
         ;;
esac

       这个时候你基本就有很大的成就感了,因为你已经成功了一大半了。然后我再跟大家说一个词——模块化编程。我们看这一个个输入对应的功能,是不是像一个个模块呢?确实。模块化编程很重要,就像我们解决问题一样,不能“一口一个大胖子”,我们需要分块逐一突破。同时我们也应该注意到每一个模块的联系,这就是我们所说的模块的 API 。我们这个模块需要得到什么可以运行?需要怎么运行?需要输出什么?我们类比一下其他的编程语言,比如我们在用 python 或者 c++ 进行编程时,我们是不是每一个函数对应一个模块呢?一个模块得到相应的输入通过这个模块来输出我们的数据呢。
       接下来我们就需要实现每一个模块的功能了,而这就是基于过程的编程。我们通过一些基本的语法,实现每一个既定的功能,我们就可以获得下面的代码(而对于这种具有相似功能的模块,我们又可以用 类比 的思想,这样不仅可以降低我们的出错率,还可以使代码看起来更美观):

case $letter in
	A|a) echo "You have chosen choice $letter"
         echo "Please enter the source file:"
         read sf
         echo "Please enter the target file:"
         read tf
         cp $sf $tf #复制
         echo "Copy done"
         sleep 5 #休眠5秒
         ;;
	B|b) echo "You have chosen choice "$letter""
         echo "Please enter the directory you want to view:"
         read vidict
         ls -l $vidict #列出该目录下的文件
         echo "All files in the directory have been listed"
         sleep 5
         ;;
	C|c) echo "You have chosen choice "$letter""
         echo "Please enter the file you want to delete:"
         read defi
         rm -rf $defi #删除文件或者目录
         echo "The delete task has been completed"
         sleep 5
         ;;
	D|d) echo "You have chosen choice "$letter""
         echo "Please enter the file you want to create:"
         read fi
         cat>>$fi #创建文件
         echo "This file has been created"
         sleep 5
         ;;
	E|e) echo "You have chosen choice "$letter""
         echo "Please enter the directory you want to create:"
         read dict
         mkdir -v $dict #创建目录
         echo "This directory has been created"
         sleep 5
         ;;
    F|f) exit 0 #退出
         ;;
      *) echo "Your input is incorrect,please re-enter:"
         read letter
         ;;
esac

       再给大家说一个我个人的编程习惯,这对于模块化编程来说是必不可少的,那就是一边编程,一边调试。比如,我在“获得用户名和日期”那里的时候,我编写好了之后,我会提前检验一下输出的效果如何,还有对于每个模块,我都会一个模块一个模块的去进行调试,每当我编写好这个模块的时候,我都会及时调试。这样有两个好处,一是不让你最后整体调试的过程中出现一堆错误,以致于不知道从哪里开始改;第二个就是便于你做细节处理,并且让你更注重编程的细节。正所谓 细节决定高度
       为什么同样的简单考试中,有的人可以考100分,有的人却只能考99分?答案就是 detail 。当你越来越注重这个东西的时候,你就会对自己要求越来越严格,你进步的就会越来越快。程序看中的是 健壮性 稳定性 。我们设计程序是为用户服务的,举个简单的例子:假如用户不小心发出了不同寻常的指令,你的程序却突然崩溃了。你想一想,你的程序相对于那些正确处理异常错误的程序是不是比较失败呢?
       最后,附上我这个程序的全部代码,当然你也可以优化一下,做更多的细节处理。看看哪些地方可以有更多的情况,哪些地方可以更简洁,哪些地方可以让程序健壮性更好等等……

#!/bin/bash
while :
#[ $letter!=F ]||[ $letter!=f ]  
do
	clear
    echo '----------------------------------------------------------------------------------------'
    echo -e #换行
    echo "User name:$(whoami)   Date:$(date)" #获得登录用户名和日期
    echo -e 
    echo '----------------------------------------------------------------------------------------'
    echo -e 
    echo 'A(a):copy B(b):list directory C(c):delete D(d):creat file E(e):creat directory F(f):exit'
    echo -e 
    echo '----------------------------------------------------------------------------------------'
    echo 'Please enter different options to get the appropriate functionality:'
    read letter
    case $letter in
	A|a) echo "You have chosen choice $letter"
         echo "Please enter the source file:"
         read sf
         echo "Please enter the target file:"
         read tf
         cp $sf $tf #复制
         echo "Copy done"
         sleep 5 #休眠5秒
         ;;
	B|b) echo "You have chosen choice "$letter""
         echo "Please enter the directory you want to view:"
         read vidict
         ls -l $vidict #列出该目录下的文件
         echo "All files in the directory have been listed"
         sleep 5
         ;;
	C|c) echo "You have chosen choice "$letter""
         echo "Please enter the file you want to delete:"
         read defi
         rm -rf $defi #删除文件或者目录
         echo "The delete task has been completed"
         sleep 5
         ;;
	D|d) echo "You have chosen choice "$letter""
         echo "Please enter the file you want to create:"
         read fi
         cat>>$fi #创建文件
         echo "This file has been created"
         sleep 5
         ;;
	E|e) echo "You have chosen choice "$letter""
         echo "Please enter the directory you want to create:"
         read dict
         mkdir -v $dict #创建目录
         echo "This directory has been created"
         sleep 5
         ;;
    F|f) exit 0 #退出
         ;;
      *) echo "Your input is incorrect,please re-enter:"
         read letter
         ;;
esac
done

真诚的希望对你有所帮助!Best wishes to you
如有错误或者不足之处,欢迎大家留言指正!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

☆下山☆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值