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

1、多动手

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

2、善用命令提示符

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

3、考虑问题要全面

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

sed -n '1p' file

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

解决办法:

sed -n '1p;1q' file

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

4、经常尝试不同的方法

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

例如:

if [ $? -eq 0 ]
then
echo "Success"
fi

另一种方法:

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

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

5、快速编码

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

6、经常使用内部命令

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

7、没有必要使用cat命令

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

例如:

$ cat /etc/passwd | grep guru

正确的方法应该是:

$ grep guru /etc/passwd

8、仔细阅读错误信息

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

9、尽量避免臃肿的命令

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

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

下面的命令不好:

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

这条命令也不够好:

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

这才是一条好的命令:

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

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

10、别吝啬添加注释

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

转载于:https://www.cnblogs.com/qinkai/archive/2012/04/02/2429815.html

关于 shell 脚本编程的10 个最佳实践相关推荐

  1. shell 脚本编程的10 个最佳实践

    每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使用命令 的种类.看待问题的方式等等.对于那些处在shell脚本 ...

  2. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---10

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  3. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---10

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  4. 《linux命令行与shell脚本编程大全》第三版 - 核心笔记(3/4):函数与图形化脚本

    <linux命令行与shell脚本编程大全> 全书4部分: ☆ [1]linux命令行(1-10章) ☆ [2]shell脚本编程基础(11-16章) ☆ [3]高级shell脚本编程(1 ...

  5. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )

    一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...

  6. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  7. Linux_《Linux命令行与shell脚本编程大全》第十八章学习总结

    时间:2017年12月04日星期一 说明:本文部分内容均摘取自书籍<Linux命令行与shell脚本编程大全>,版权归原作者所有.<Linux命令行与shell脚本编程大全>( ...

  8. shell脚本编程for循环求阶乘_shell脚本编程(完结版).pdf

    shell脚本编程(完结版) Shell 脚本编程学习笔记 2013 年 5 月 2 日 追风~忆梦 如有任何疑问,请联系作者,作者 QQ:1028150787,或者到韦东山群共同讨论 1 Shell ...

  9. Linux shell脚本编程(三)

    Linux shell脚本编程 -------------------------------------------------------------------- 注:如果你对python感兴趣 ...

最新文章

  1. putty改oracle数据库密码,用putty远程访问虚拟机linux系统Oracle数据库。
  2. html文字超链接不让变色,css不让超链接变色怎么设置?
  3. SAP Spartacus如何使用自定义的Cart Service
  4. IntelliJ IDEA 源值1.5已过时,将在未来所有版本中删除
  5. ES6模板字符串【${}配合反单引号一起用】
  6. Java系列 - 用Java8新特性进行Java开发太爽了
  7. 定义一个Employee类,排序
  8. VisualStudio VC redist各版本下载链接
  9. c语言小游戏百度云资源,c语言小游戏合集
  10. 算法产品化---人脸识别采集终端的摄像头品质要求
  11. Android淑女剑之HorizontalScrollView之窈窕淑女
  12. Java校验身份证号码合法性
  13. Microsoft Excel 教程:如何在 Excel 中筛选唯一值或删除重复值?
  14. 计算机新手必备知识,新手怎么查看电脑配置,购机必备知识!
  15. Android下拉列表框
  16. 基于AI的自然语言处理
  17. DTS中video-interfaces接口详解
  18. EDA-功能仿真和时序仿真有什么区别?
  19. StateFlow与SharedFlow(一)
  20. html+js 弹出对话框(模态框)

热门文章

  1. android鸿洋布局,Android基础ConstrainLayout约束布局的介绍和使用
  2. 国家计算机科学进展,主动网络安全的研究与进展
  3. extmail html文件丢失,extmail/extman登录界面无法显示的故障解决
  4. 支付宝php rsa签名验签工具,alipay rsa2 签名验证
  5. java中,将string 转化成long
  6. Java案例:Swing版记事本
  7. JavaScript学习笔记:创建自定义对象
  8. 【BZOJ3956】Count,单调栈+ST表维护区间最大值
  9. win7怎么修改服务器端口,win7服务器端口设置方法
  10. ios fixed定位后内容不显示_记录CSS中 position:fixed 踩的坑