写出健壮的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
分享到:
相关推荐
对于系统管理员和开发者来说,掌握高级Bash脚本编程技巧是提高工作效率的关键。这份“高级Bash脚本编程指南”涵盖了从基础到进阶的各个层面,旨在帮助用户深入理解和熟练运用Bash脚本。 首先,让我们了解一下Bash的...
通过阅读《高级Bash脚本编程指南》,你可以深入理解Bash脚本的内在原理,并能够编写出高效、可靠的自动化脚本来简化日常的Linux系统管理工作。书中实例丰富,注释详细,非常适合自学和参考。同时,配合HTML格式的...
### Linux中高效编写Bash脚本的9个技巧 ...总之,以上这些技巧可以帮助开发者编写出更加高效、可靠和易于维护的Bash脚本。无论是初学者还是经验丰富的系统管理员,掌握这些基础知识都是非常有益的。
Bash脚本是通过Shell命令行进行自动化任务的一种方式,它允许用户编写一系列指令,形成一个可执行的脚本文件,极大地提高了工作效率。以下是一些关键的Bash脚本编程知识点: 1. **基础语法**:包括变量声明、赋值、...
Linux Bash脚本编程是Linux系统管理与自动化任务执行的核心技能之一。Bash,全称Bourne-Again SHell,是Unix及Linux操作系统中最常用的...通过深入学习这本书,你将能够编写出高效、可维护的Bash脚本来满足各种需求。
以下是一些提高Bash脚本健壮性的关键技巧: 1. **使用`set -u`**: `set -u` 或 `set -o nounset` 是Bash的一个选项,它强制脚本在使用未定义的变量时立即退出。这有助于避免因未初始化的变量导致的潜在危险,例如...
Bash脚本在遇到错误时往往直接退出,而Python提供了异常处理机制,可以在出现错误时优雅地捕获并处理,增强了脚本的健壮性。 4. **丰富的库支持** Python拥有大量的第三方库,如`os`、`sys`、`subprocess`用于...
### Bash脚本示例解析与ROS环境配置详解 #### 一、引言 本文将详细介绍一个简单的Bash脚本示例,该脚本主要用于设置ROS(Robot Operating System)环境、构建ROS包,并运行一个简单的ROS节点。对于机器人开发者来...
### 根据MD5HASH监控LINUX的目录文件的bash脚本:深入解析与实践 在网络安全和系统管理领域,确保文件的完整性和安全性是一项至关重要的任务。在Linux环境中,利用脚本来自动化这一过程可以极大地提高效率和响应...
**高级Bash脚本编程指南**是一本专为熟悉基础Shell编程并希望深入学习Bash特性和技巧的用户准备的指南。Bash(Bourne-Again SHell)是Linux和Unix系统中最常用的命令行解释器,它为用户提供了一种强大而灵活的方式来...
本书《高级Bash脚本编程指南》是一本深入探讨UNIX®/Linux环境下Bash Shell脚本编程的权威指南,由Mendel Cooper所著。全书内容覆盖广泛,旨在为读者提供从基础到高级的Shell编程技能,并假定读者没有任何脚本编程或...
在IT行业中,Linux Bash脚本编程是系统管理员、开发者以及自动化任务执行者不可或缺的...通过学习这本书,你将能够编写出能够自动化日常任务、简化工作流程的Bash脚本,从而提高工作效率,成为真正的Linux自动化专家。
本文中我将介绍一些让bash脚本变得健壮的技术。你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次。chroot=$1...rm-rf$chroot/usr/share/doc如果上面的代码你没有给参数就运行,你不会仅仅删除掉...
在IT行业中,Bash脚本是一种非常实用的自动化工具,特别是在Linux和Unix系统中。Bash(Bourne-Again SHell)是GNU项目的一部分,是这些操作系统中的默认命令行解释器。它允许用户通过编写脚本来执行一系列命令,极大...