阅读更多

22顶
1踩

编程语言

翻译新闻 关于 shell 脚本编程的10 个最佳实践

2012-04-01 18:03 by 正式编辑 nemohq 评论(6) 有34848人浏览
每一个在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、别吝啬添加注释

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

英文原文10 good shell scripting practices
22
1
评论 共 6 条 请登录后发表评论
6 楼 timberwolfes 2013-03-04 14:23
其实我会告诉你我现在都不怎么写SHELL了,既然有PYTHON为什么不选择语法简单功能又强大的跨平台脚本语言呢?
5 楼 和平鸽 2012-11-22 15:42
写好脚本的关键是什么?
4 楼 ctguhqh 2012-04-04 10:56
very good!仔细阅读了一遍
3 楼 superlittlefish 2012-04-03 16:37
fancyleeo 写道
有一点不太懂:有时候,使用了多余的cat命令会让你的代码看起来很丑陋,而且还会带来性能上的问题。

第一条会让代码看起来丑陋,我认为是仁者见仁智者见智的事情,但是为什么使用太多的cat会导致性能问题呢?

使用Cat 会引起进程间切换. 多了一次IO操作.
2 楼 fancyleeo 2012-04-02 20:47
I like the blog more than this post. thanks.
1 楼 fancyleeo 2012-04-02 19:58
有一点不太懂:有时候,使用了多余的cat命令会让你的代码看起来很丑陋,而且还会带来性能上的问题。

第一条会让代码看起来丑陋,我认为是仁者见仁智者见智的事情,但是为什么使用太多的cat会导致性能问题呢?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • hibernate4 mysql配置文件_Hibernate配置文件详解

    Hibernate配置方式Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法。就拿Hibernate配置来说,常用的有如下三种方式,任选其一。在 hibernate.cfg.xml 中加入元素 、,放置在类路径...

  • Hibernate之配置文件

    Hibernate的配置文件可以为XML或者properties文件,默认的配置文件名称为hibernate.cfg.xml或者hibernate.properties,位于classpath下面。properties文件中的参数是具有hibernate前缀的,而xml文件没有 ...

  • Hibernate - hibernate.cfg.xml配置文件详解

    Hibernate 配置文件主要用于配置数据库连接和 Hibernate 运行时所需的各种属性。每个 Hibernate 配置文件对应一个 Configuration 对象。 Hibernate配置文件可以有两种格式: hibernate.properties hibernate.cfg...

  • hibernate 配置文件

    默认配置文件名:hibernate.cfg.xml hibernate核心文件夹下 找到dtd文档 复制里面的dtd 到创建好的hibernate.cfg.xml配置文件中做头部 直接打尖括号 会出现更目录标签 =====================================...

  • Hibernate核心配置文件

    Hibernate就是一个持久层的ORM的框架 (ORM :Object Relational Mapping.对象关系映射.框架是一个个JAVA类构成的体系结构,属于半成品);...Hibernate映射稳文件 格式:类名.hbm.xml ...

  • Hibernate的核心配置文件和API

    一,核心配置文件 1,Hibernate的映射文件*.hbm.xml 基本结构: <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ...

  • Hibernate的配置文件,对象状态,方法讲解

    三个准备:准备1: 添加hibernate依赖的jar文件(lib/requried下所有的jar文件) 准备2: 编写实体类和hibernate的映射文件(将实体和表建立关联映射): *.hbm.xml class节点 (name="实体类全限定类名";table=...

  • Hibernate配置及自定义注册映射文件

    作,多数配置参数都有默认的配置值,也是我们日常使用hibernate的必须品。 Hibernate JDBC属性 -------------------------------------------------------------------------------- | 属性名

  • 2.Hibernate配置文件

    一.Hibernate的全局配置文件详解 1. hibernate-configuration元素 hibernate-configuration节点是全局配置文件的根节点用来定位映射文档的位置。 2.session-factory元素 session-factory节点对应着SessionFactory...

  • 8.Hibernate注解及其详细使用(在实体类中配置映射文件)

    Hibernate提供了注解来进行对象(关系映射),它可以代替大量的hbm.xml文件,使得Hibernate程序的文件数量大大精简。使用注解,可以直接将映射信息定义在持久化类中,而无须编写对应的*.hbm.xml文件。

  • Hibernate配置文件

    该文件中存放着数据库连接驱动程序类,登录数 据库的用户名/密码,映射持久化类配置文件的... Hibernate配置文件有两种描述: XML文件方式 默认文件名: hibernate.cfg.xml 提供较好的结构与配置方式 建议使用 properti

  • .net core 控制台应用程序读取配置文件app.config

    新增app.config,新增文件选择应用程序配置文件,会默认文件名为 App.config ,点击添加即可。我这里的开发环境是 win7 + vs2019 + .net core 3.1。如果是.net framwork ,就不需要nuget了,直接添加引用就行了,

  • Hibernate学习--JPA配置文件persistence.xml解析

    前言JPA和Hibernate的水太深,搞到现在还是不大明白,先拿出来晒晒。日后还会更新。JPA是什么JavaEE5.0 的平台的 ORM 标准规范。为应用程序访问持久层提供统一的方式。(用于数据库访问之类的)JPA 与 Hibernate 的...

  • Hibernate配置文件解读

    Hibernate配置文件主要有两个,一个是src路劲下的hibernate.cfg.xml配置文件;一个是位于domian下的JavaBean.hbm.xml映射文件。当然前提是将jar包导入。 两者都需要dtd约束分别位于hibernate3.jar 下 org.hibernate...

  • Hibernate1:hibernate配置文件

    3.配置全局配置文件hibernate.cfg.xml(要导入dtd) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration ...

  • Hibernate-配置文件-hibernate.cfg.xml

    Hibernate配置文件 : Hibernate 配置文件主要用于配置数据库连接和 Hibernate 运行时所需的各种属性 每个 Hibernate 配置文件对应一个 Configuration 对象 Hibernate配置文件可以有两种格式: hibernate....

  • 10 02Hibernate之配置文件与核心类库详解

    文章目录1 配置文件说明2 Hibernate操作类 在整个Hibernate编写的过程之中会生成一些文件并且也使用到了一些新的处理类。 1 配置文件说明 在整个Hibernate里面最为核心的两种配置文件: (1)Hibernate总配置文件:...

  • Hibernate框架基础——Hibernate API及Hibernate主配置文件

    Hibernate的学习路线图Hibernate API简介ConfigurationConfiguration类负责管理Hibernate的配置信息,包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接...

  • 如何使用SpringMVC +Hibernate Validator实现从配置文件读取自定义错误信息并解决读取中文乱码问题

    1.hibernate的校验框架validation所需要jar包 2.spring-mvc.xml添加validator配置 <mvc:annotation-driven validator="validator"></mvc:annotation-driven> &...

  • qt-creator-opensource-linux-x86_64-13.0.0.run

    qt-creator-opensource-linux-x86_64-13.0.0.run

Global site tag (gtag.js) - Google Analytics