博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推荐Bash提高资料:写出健壮的Bash脚本
阅读量:2440 次
发布时间:2019-05-10

本文共 1679 字,大约阅读时间需要 5 分钟。

写出健壮的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 EXITelse	echo "Failed to acquire lockfile: $lockfile"	echo "held by $(cat $lockfile)"fi

 

 

保持原子化(事务化)

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

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

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

 

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

更详细的内容,请参看

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

 

 

 

转载地址:http://tlnqb.baihongyu.com/

你可能感兴趣的文章
disconf apps_Google Apps Drop IE6支持
查看>>
使用Screenr创建截屏视频
查看>>
微信小程序使用flex布局_使用Flex来启动您PHP应用程序!
查看>>
互联网总线带宽_新技术将使互联网带宽翻倍
查看>>
java自由职业者是什么_一个成功的自由职业者需要什么?
查看>>
java语言作为入门好吗_Java作为学生的第一语言
查看>>
sql内联接外联接三张表_在SQL中联接三个或更多表
查看>>
企业为什么需要it服务?_为什么要考虑为您的企业提供IT支持服务?
查看>>
Django博客教程–创建一个简单的博客
查看>>
操作系统的主要类型_操作系统类型
查看>>
编程和编码的区别_安全编程和编码提示
查看>>
实用的小应用_使您的新应用更安全的实用提示
查看>>
小学生c语言编程入门教程_学生编程语言
查看>>
android mvp示例_Android深层链接示例
查看>>
Android RSS阅读器教程
查看>>
SkySilk –托管云服务提供商
查看>>
使用字典的Python HashMap实现
查看>>
流程图与算法_流程图与算法之间的区别
查看>>
wps宏的功能_宏与功能之间的区别
查看>>
while和do while循环之间的区别
查看>>