• 关于shell脚本编程的10个最佳实践


    每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程。但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度、使 用命令的种类、看待问题的方式等等。对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快、更好的学习这些编程技巧。 下面,我们就来讨论这些能帮助你学习shell脚本编程的方法吧。

    1.多动手

    你想学习shell脚本编程,这很不错。于是你拿了一本书开始学习。一些人会首先通读整本教材后再上机练习。这种方法可能适用于一些人,但我却不太 看好它。我的建议是,仅仅学一些最基础的能够让你开始编码的知识就可以了。之后,动手写一些简单的程序吧。一旦你由于知识上的欠缺而不得不停止时,再回到 书本上去读你想要了解的那部分,然后继续做你的项目。如此周而复始,不断提高你的水平。这种边学边做的方法曾让我受益良多。

    2.善用命令提示符

    有时候,我们写的脚本中有一些错误。我们修改错误,运行脚本,但系统再次报错。并且这个改错报错的过程可能会发生很多次。碰到这些情况,首先需要找 到有问题的行或命令,这可以通过一些调试语句来轻松做到。一旦发现这条语句,尝试在命令提示符下执行相同的语句。如果它在命令提示符下开始正常运行,你就 可以容易的推断出它不能正常运行的原因了。可能是由于某些错误输入的命令,或者是某些环境变量不匹配,或者是从不同的地方引用了某个二进制文件等等。这种 方法会让调试变得简单易行。

    3.考虑问题要全面

    现在我们来看个问题。你想到了关于某个问题的解决方案,但这个解决方案只适用于处理小型文件。可是当处理比较大的文件时,你该怎么办?举个例子,我们想要得到一个文件的第一行内容:

    1. sed -n '1p' file   

    这条语句当然会给出你想要的第一行内容。可是如果处理的文件包含上百万条记录呢?尽管上面的那条sed命令可以输出文件的第一行内容,但是想要处理大型文件一定会带来性能上的问题。

    解决办法:

    1. sed -n '1p;1q' file   

    这条命令将只输出第一行,同时退出程序。

    4.经常尝试不同的方法

    你在写脚本时碰到一个问题,然后你找到了一种独特的解决方法。下一次你偶然又碰到类似的问题,这时,不要再用以前你用过的方法来解决。试试另外一种方法吧。如果某一天再次遇到这种情况,再试试其它方法。

    例如:

    1. if [ $? -eq 0 ]    
    2. then    
    3. echo "Success"    
    4. fi    

    另一种方法:

    1. [ $? -eq 0 ] && echo "Success"   

    现在你可能会明白这个博客里会有那么多以“……的不同解决方法”为题的文章了吧。所有这些文章的目的都是用来帮助订阅这个博客的开发者开阔视野,打开思路。

    5.快速编码

    脚本可以节省我们的时间,提高生产力。可是,难道我们花在写脚本和测试上的时间还少吗?我们想写一个脚本,于是打开一个文件,写下代码,保存文件, 之后运行脚本,系统报错,我们再打开文件修改、保存、运行……在这个过程中会花费很多时间。在此前的一篇题为《如何快速写shell脚本》的文章里,你可 以学会如何编写脚本和测试正在运行中的脚本,而不用再回顾命令提示符。这些方法可以加快编码的速度。当我写脚本的时候,我总是使用这些方法。而且我可以很 肯定的说,它们帮我节约了不少时间。

    6.经常使用内部命令

    无论碰到哪种情况,请尽量考虑使用内部命令而不是外部命令。在此前的一篇题为《内部命令和外部命令》的文章里,我们可以看到二者间的差异。用内部命 令对你永远都有好处。根据正在处理的输入文件的大小,内部命令可以在性能方面为你节省很多。虽然你并不总是有这样选择内部命令抑或外部命令的机会,但在某 些情况下,你一定能做出正确的选择。

    7.没有必要使用cat命令

    这是我们经常在论坛里讨论的话题之一。没有必要使用cat命令指的是在有些时候,我们会发现根本没有必要使用cat命令。有时候,使用了多余的cat命令会让你的代码看起来很丑陋,而且还会带来性能上的问题。

    例如:

    1. $ cat /etc/passwd | grep guru   

    正确的方法应该是:

    1. $ grep guru /etc/passwd   

    8.仔细阅读错误信息

    程序员常犯的一个错误是:当我们敲入的命令报错后,我们中的大多数人只是对错误信息一瞥而过,而不会去认真的读一读。很多时候,错误信息里就包含了 解决办法。更重要的是,有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报错。这可能会持续很长时间。但实际上,旧 的错误可能已经被纠正,只是由于出现了其它一些新错误才导致系统再次报错。而我们依旧在怀疑为什么修改好的代码依然不能正常运行。因此,请你养成仔细阅读 错误信息的习惯。

    9.尽量避免臃肿的命令

    你正在尝试去从一个大的文件中筛选某条信息。接下来你可能写一大堆命令来实现这一功能。可是,尽管你将得到正确的结果,你写的命令却不够好,且晦涩难懂。因此,我们应该尽量避免这种情况发生。下面这个例子就是代码优化的好例子。

    例如:检索用户ID值为502的用户名。

    下面的命令不好:

    1. $ grep 502 /etc/passwd | cut -d: -f1   

    这条命令也不够好:

    1. $ grep 502 /etc/passwd | awk -F":" '{print $1}'   

    这才是一条好的命令:

    1. $ awk -F":" '$3==502{print $1}' /etc/passwd   

    正如以上示例,用一条简单的awk命令就可以完成检索任务。

    10.别吝啬添加注释

    你写了一份脚本。一两个星期后,你再次打开脚本文件,如果没有注释在里面的话,你可能会花上很多时间才能理解这些代码。虽然代码是我们自己写的,但 这依旧会浪费我们很多的时间。脚本是用来节省时间的,因此,我们没有理由浪费时间去理解这些用来节省时间的文件。所以,请养成在脚本中添加注释的好习惯。 这些注释不必很详细,能让自己或别人读懂就行。

  • 相关阅读:
    Centos下使用Docker部署MySql
    用C#编写游戏脚本
    VS2013使用自带的数据库 Microsoft SQL Server 2012 Express LocalDB
    WIN11下访问Gitee(WIN11下GITEE 拉取PULL和推送PUSH失败的解决办法)
    前端MVC Vue2学习总结(二)——Vue的实例、生命周期与Vue脚手架(vue-cli)
    前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例
    JavaScript学习总结(五)——jQuery插件开发与发布
    JavaScript学习总结(四)——this、原型链、javascript面向对象
    JavaScript学习总结(三)——闭包、IIFE、apply、函数与对象
    JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
  • 原文地址:https://www.cnblogs.com/sand-tiny/p/3530279.html
Copyright © 2020-2023  润新知