快捷搜索:

Shell脚本编写的八条可靠建议(值得收藏)

Shell脚本编写的八条可靠建议(值得收藏)

  这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了。

  shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同。

  在多数情况下,以上五种写法都是等价的。但是,写过程序的人都知道:“少数情况”里往往隐藏着意想不到的坑。

  如果系统的默认 shell 不是 bash 怎么办?比如某 Linux 发行版的某个版本,默认的 sh 就不是 bash。

  set -x会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。

  set -e会在执行出错时结束程序,就像其他语言中的“抛出异常”一样。(准确说,不是所有出错的时候都会结束程序,见下面的注)

  注:set -e结束程序的条件比较复杂,在man bash里面,足足用了一段话描述各种情景。大多数执行都会在出错时退出,除非 shell 命令位于以下情况:

  这两个组合在一起用,可以在 debug 的时候替你节省许多时间。出于防御性编程的考虑,有必要在写第一行具体的代码之前就插入它们。扪心自问,写代码的时候能够一次写对的次数有多少?大多数代 码,在提交之前,通常都经历过反复调试修改的过程。与其在焦头烂额之际才引入这两个配置,不如一开始就给 debug 留下余地。在代码终于可以提交之后,再考虑是否保留它们也不迟。

  且慢!工欲善其事,必先利其器。这次,我就介绍一个 shell 脚本编写神器:shellcheck

  说来惭愧,虽然写了几年 shell 脚本,有些语法我还是记不清楚。这时候就要依仗 shellcheck 指点一下了。shellcheck 除了可以提醒语法问题以外,还能检查出 shell 脚本编写常见的 bad code。本来我的N条建议里面,还有几条是关于这些 bad code 的,不过考虑到 shellcheck 完全可以发掘出这些问题,于是忍痛把它们都剔除在外了。毫无疑问,使用 shellcheck 给我的 shell 编写技能带来了巨大的飞跃。

  所谓“站在巨人的肩膀上”,虽然我们这些新兵蛋子,技能不如老兵们强,但是我们可以在装备上赶上对方啊!动动手安装一下,就能结识一个循循善诱的“老师”,何乐而不为?

  在 shell 脚本中,偶尔可以看到这样的做法:echo $xxx awk/sed/grep/cut... 。看起来大张形势的样子,其实不过是想修改一个变量的值。杀鸡何必用牛刀?bash内建的变量展开机制已经足以满足你各种需求asp教程!还是老方法, read the f**k manaul! man bash 然后搜索Parameter Expansion,下面就是你想要的技巧。

  随着代码越写越多,你开始把重复的逻辑提炼成函数。有可能你会掉到bash的一个坑里。在bash,如果不加 local 限定词asp源码文件用什么软件编辑的好看点,变量默认都是全局的。变量默认全局——这跟 js 和 lua 相似;但相较而言,很少有 bash 教程一开始就告知你这个事实。在顶级作用域里,是否是全局变量并不重要。但是在函数里面,声明一个全局变量可能会污染到其他作用域(尤其在你根本没有注意 到这一点的情况下)。所以,对于在函数内声明的变量,请务必记得加上 local 限定词。

  如果你写过稍微复杂点的在后台运行的程序,应该知道 posix 标准里面“信号”是什么一回事。如果不知道,直接看下一段。像其他语言一样,shell 也支持处理信号。trap sighandler INT可以在接收到 SIGINT 时调用 sighandler 函数。捕获其他信号的方式以此类推。

  不过 trap 的主要应用场景可不是捕获哪个信号。trap 命令支持“捕获”许多不同的流程——准确来说,允许用户给特定的流程注入函数调用。其中最为常用的是trap func EXIT和trap func ERR。

  trap func EXIT允许在脚本结束时调用函数。由于无论正常退出抑或异常退出,所注册的函数都能得以调用,在需要调用一个清理函数的场景下,我都是用它注册清理函数,而不是简单地在脚本结尾调用清理函数。

  trap func ERR允许在运行出错时调用函数。一个常用的技法是,使用全局变量ERROR存储错误信息,然后在 注册的函数中根据存储的值完成对应的错误报告。把原本四分五裂的错误处理逻辑集中到一处,有时候会起奇效。不过要记住,程序异常退出时,既会调用EXIT 注册的函数,也会调用ERR注册的函数。

  这条建议的名字叫“三思而行”。其实无论写什么代码,哪怕只是一个辅助脚本,都要三思而行,切忌粗心大意。不,写脚本的时候更要记住这点。毕竟许多 时候,一个复杂的脚本发端于几行小小的命令。一开始写这个脚本的人,也许以为它只是一次性任务。代码里难免对一些外部条件有些假定,在当时也许是正常的, 但是随着外部环境的变化,这些就成了隐藏的暗礁。雪上加霜的是,几乎没有人会给脚本做测试。除非你去运行它,否则不知道它是否还能正常使用。

  要想减缓脚本代码的腐烂速度,需要在编写的时候辨清哪些是会变的依赖、哪些是脚本正常运行所不可或缺的。要有适当的抽象,编写可变更的代码;同时要有防御性编程的意识,给自己的代码一道护城河。

  有些时候,使用 shell 写脚本就意味着难以移植、难以统一地进行错误处理、难以利索地处理数据。

  虽然使用外部的命令可以方便快捷地实现各种复杂的功能,但作为硬币的反面,不得不依靠grep、sed、awk等各种工具把它们粘合在一起。

  如果有兼容多平台的需求,还得小心规避诸如BSD和GNU coreutils,bash版本差异之类奇奇怪怪的陷阱。

  解决特定的问题要用合适的工具。知道什么时候用 shell,什么时候切换到另外一门更通用的脚本语言(比如ruby/python/perl),这也是编写可靠 shell 脚本的诀窍。如果你的任务可以组合常见的命令来完成,而且只涉及简单的数据,那么 shell 脚本就是适合的锤子。如果你的任务包含较为复杂的逻辑,而且数据结构复杂,那么你需要用ruby/python之类的语言编写脚本。

  以上所述是小编给大家介绍的Shell脚本编写的8 个可靠建议(值得收藏),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  Linux file命令用于辨识文件类型。通过file指令,我们得以辨识该文件的类型。语法file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]file 是通过查看文件的头部信息来获取文件类型,而不是像 Win...查看详情

  Linux下的两种定时执行任务的方法:at命令,以及crontab服务,小编整理了关于这2个命令的详细用法,希望大家学习后能够更加深入的理解。(1)at命令假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了。设置at命令很简单,指示定运行的时间,那么就会在哪个...查看详情

  前言创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户了解脚本能做什么,不能做什么;通常菜单脚本会清空显示区域,然后显示可用的选项列表。本文给大家详细介绍了shell创建文本菜单与窗口部件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细...查看详情

  简介: FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上...查看详情

  使用Shell脚本在Linux服务器上能够控制、毁坏或者获取任何东西,通过一些巧妙的攻击方法黑客可能会获取巨大的价值,但大多数攻击也留下踪迹。当然,这些踪迹也可通过Shell脚本等方法来隐藏。寻找攻击证据就从攻击者留下的这些痕迹开始,如文件的修改日期。每一个 Linu...查看详情

  前言相信大家应该都有所体会,shell脚本可以说作用非常大,在服务器领域,用shell操作事务可比手动点击要方便快捷得多了。虽然只是文字界面,但是其强大的处理功能,会让各种操作超乎想象。而且,也可以将这些习惯移植到日常的工作当中,提升办事效率。其实shell语法很简单,基本上就是...查看详情

  Linux 下没有百度网盘客户端,用浏览器下载速度慢得急死人鼠标移到链接处, 右键, 然后复制链接接着在终端里输入axel -n 50 -o filename.ext “粘贴链接到此处”axel 是下载程序名, -n 后面数字是线程数,多少自己决定, -o 后面下载到本机上 保持...查看详情

  一、概述为禁止普通用户su至root,需要分别修改/etc/pam.d/su和/etc/login.defs两个配置文件。二、详细配置(1)去除/etc/pam.d/su文件中如下行的注释:#auth required pam_wheel.so use_uid(2...查看详情

  Linux中的bz2压缩格式的实例详解一 语法bzip2 源文件压缩为bz2格式,不保存源文件bzip2 -k 源文件压缩之后保留原文件注意:bzip2命令不能压缩目录bzip2 -d 压缩文件解压缩,-k保留压缩文件bunzip2 压缩文件解压缩,-k保留压缩文件二...查看详情

  Linux链接命令的实例详解一 语法ln -s [源文件] [目标文件]命令英文含义:link功能描述:生成链接文件选项:-s 创建软链接 二 硬链接特征原文件和硬链接文件删除其中任何一个都没问题。三 硬链接实战[root@localhost ~]# cd test[root@l...查看详情

您可能还会对下面的文章感兴趣: