摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程。对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快、更好的学习这些编程技巧。

每一个在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.别吝啬添加注释

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

文章出自:unix-school

shell脚本编程的10个最佳实践的更多相关文章

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

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

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

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

  3. Shell脚本编程具体解释

    第12章 Shell脚本编程   l  Shell命令行的执行 l  编写.改动权限和运行Shell程序的步骤 l  在Shell程序中使用參数和变量 l  表达式比較.循环结构语句和条件结构语句 l ...

  4. 浅谈自底向上的Shell脚本编程及效率优化

    作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...

  5. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  6. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  7. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  8. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  9. jenkins2 pipeline插件的10个最佳实践

    jenkins pipeline的10个最佳实践. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciandcd ...

随机推荐

  1. java中的死锁现象

    死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. java 死锁产生的四个必要条件: 1.互斥使用,即当资源被一个线 ...

  2. Monitoring tools that everyone's currently using

    Although a lot of new tools have arrived since 2011, it's clear that older open source tools like Na ...

  3. Hadoop集群 能打开50070端口不能打开8088端口 web浏览器界面

    两天时间,知道现在才把这个东西解决  解决的灵感来源于百度知道一句话谢谢这个哥们 谢谢这个哥们! ​我的目录是在/home/hadoop/tmp  大家如果遇到这个问题,希望能按照我的办法去试一下 2 ...

  4. 【转】如何使用Java、Servlet创建二维码

    归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指 ...

  5. android 自定义控件之事件

    首先,继承需要扩展的VIEW,然后在里面添加一个自己的事件方法,例如, oniconclick(myinterface pinterface){ minterface = pinterface; } ...

  6. jQuery获取多种值的方法

    **jQuery 1.3.2版本下的 jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关设置** 1.判断是否已经打 ...

  7. css实现三角形(转)

    css实现三角形 (2012-09-10 14:17:26) 标签: css 三角形 杂谈 分类: 网页制作 css实现三角形的原理是:当元素的宽高为0,边框(border)不为0时,四个角边框交界重 ...

  8. ROS与Matlab系列:一个简单的运动控制

    ROS与Matlab系列:一个简单的运动控制 转自:http://blog.exbot.net/archives/2594 Matlab拥有强大的数据处理.可视化绘图能力以及众多成熟的算法函数,非常适 ...

  9. Python_pip_01_pip的相关操作

    >Python中的pip是什么?能够做些什么? pip是Python中的一个进行包管理的东西,能够下载包.安装包.卸载包......一些列操作 >怎么查看pip的相关信息 在控制台输入: ...

  10. iOS 聊天界面

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...