`

推荐Bash提高资料:写出健壮的Bash脚本

阅读更多

写出健壮的Bash脚本

本文链接:http://codingstandards.iteye.com/blog/1458592

 

也就是在Bash中使用防御性编程。

什么是防御性编程? http://book.51cto.com/art/201110/299827.htm 写道
什么是防御性编程?

顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能地"保护"自己。我们通过明确地在代码中对设想进行检查,击碎了未记录下来的设想。这是一种努力,防止(或至少是观察)我们的代码以将会展现错误行为的方式被调用。
 

 

set -u  /  set -o nounset

对没有初始化的变量做替换时,报错退出。

help set 写道
-u Treat unset variables as an error when substituting.

        -o option-name
                nounset      same as -u

 

 

 

set -e  /  set -o errexit

如果执行命令的退出码不是0时,脚本立即退出。这样可以避免某些程序片段没有做错误检查而导致不可预期的结果。

help set 写道
-e Exit immediately if a command exits with a non-zero status.

        -o option-name
                errexit      same as -e

 

 

使用 "$VAR" 而不是 $VAR

对于引用变量,最好写在双引号中,而不是让它裸奔

 

因为VAR变量的值中包含空白时,就有可能造成程序出错

 

使用 "$@" 而不是 $@

因为如果某个参数中包含空白时,不加引号的$@会有问题,含空格的参数将会分裂成多个

 

 

处理信号 signal

在编写C代码时通常会在程序开始时使用signal()设置信号处理函数,使程序更加健壮。

在Bash中,可以使用 trap 对信号处理,比如删除临时文件、杀死进程等。

 

trap command signal [signal ...]

 

避免出现竞态条件

help set 写道
-C If set, disallow existing regular files to be overwritten
by redirection of output.

        -o option-name
                noclobber    same as -C

 

使用文件锁的情况,最好如下处理,以避免竞态条件:

if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; then
	trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
	#critical-section
	rm -f "$lockfile"
	trap - INT TERM EXIT
else
	echo "Failed to acquire lockfile: $lockfile"
	echo "held by $(cat $lockfile)"
fi

 

 

保持原子化(事务化)

要么全部做,要么什么都不做。

比如:下面的代码展示的将文件中的一个字符串替换成另一个字符串,保证所有文件都被替换,或者都不被替换。

思路是先把要处理的文件复制到一个临时目录,进行替换操作,然后再替换原来的。即使 Ctrl+C 终止,也不会出现部分被替换的情况。

 

cp -a /var/www /var/www-tmp
for file in $(find /var/www-tmp -type -f -name "*.html"); do
	perl -pi -e 's/www.example.net/www.example.com/' $file
done
mv /var/www /var/www-old
mv /var/www-tmp /var/www
 

更详细的内容,请参看

http://sd.csdn.net/a/20120319/313229.html

 

 

 

3
0
分享到:
评论
3 楼 五月天 2012-03-21  
收藏一下,有时间慢慢看下
2 楼 codingstandards 2012-03-21  
netkiller.github.com 写道
不错,回楼主了,这年头看帖不回的太多了。我写的帖子也没有 人 回复。。我知道楼主的心情,给你回复一下, 

谢谢支持!
1 楼 netkiller.github.com 2012-03-21  
不错,回楼主了,这年头看帖不回的太多了。我写的帖子也没有 人 回复。。我知道楼主的心情,给你回复一下, 

相关推荐

    写出健壮Bash Shell脚本的一些技巧总结

    主要介绍了写出健壮Bash Shell脚本的一些技巧总结,本文总结了set -u、set -e、竟态条件、信号描述等内容,需要的朋友可以参考下

    写出健壮的Bash脚本

    本文中我将介绍一些让bash脚本变得健壮的技术。你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次。chroot=$1...rm-rf$chroot/usr/share/doc如果上面的代码你没有给参数就运行,你不会仅仅删除掉...

    如何编写健壮的Bash脚本(经验分享)

    本文介绍下,编写出健壮的bash shell脚本的方法,感兴趣的朋友参考学习下

    BashWizard:Bash向导的React版本

    Bash向导是Chromium应用程序,可根据输入到工具中的“参数”生成Bash脚本。 Bash向导支持以下功能: 可以为每个参数指定默认值,并在脚本中声明变量 创建EchoInfo,EchoWarning,EchoError和EchoIfVerbose函数,以...

    shellsync:使用 Node.js 和 TypeScript 同步 shell 脚本

    外壳同步Node.js 的同步 shell 脚本。 实用:使用同步代码,使用熟悉的 shell 命令自动执行任务。 强大:将 shell 世界与 JavaScript 或 TypeScript 中的函数、模块、库、try/catch/finally、正则表达式等结合起来。...

    mmmv_raspbian_t2:Raspberry Pi的基于Debian / Raspbian的自定义存储卡映像。-开源

    这些自定义包括与健壮性相关的更改(例如,关闭交换空间以最大程度地减少存储卡的磨损)和与舒适性增强相关的更改(例如,添加自定义编译的二进制文件和添加自定义的Bash脚本集)。 Bash脚本集称为mmmv_userspace_...

    生成器:一个非常基本的PKGBUILD生成器

    建造者一个非常基本的bash脚本,可以从给定的github存储库自动构建软件包,并将其上传到Web服务器,git存储库或gh releases存储库。 虽然脚本是为archdroid回购目的而完成的工作,但它远非完整而健壮,例如:不处理...

    Basic-Bulk-RNA-seq-Workflow:在Snakemake中演示RNA-seq工作流程

    Snakemake中的基本散装RNA-seq管线目录描述该存储库包含两种基本形式的基本批量RNA-seq管道的演示,即Snakemake (在workflow/目录中)和bash脚本(在bash_workflow/目录中)。 这两个工作流程执行相同的分析,但是...

    scmpuff :: 1234:常见git命令的数字文件快捷方式

    它专注于简单性,速度,健壮性和跨平台支持。 大多数功能都包含在已编译的二进制文件中,并且shell集成在100行以下的shell脚本中。 scmpuff当前可在任何类似* nix的操作系统中在bash和zsh中运行。 考虑到它是在跨...

    TCPController-开源

    TCPController的基本前提是为某些uscpi-tcp程序包的工作提供一个简单而健壮的接口。 最初计划使用BASH脚本和安全的Web管理员,稍后再计划。

Global site tag (gtag.js) - Google Analytics