天天看点

高级Bash脚本编程入门

最近在看《advanced bash scripting guide》这本书,第二章举了一个清除日志的例子,来讲述如何使用bash进行编程并聊到了一些编程规范。本文主要是基于这部分内容记录我的读书笔记并整理一些相关知识点。

说到清除日志,你可以使用下面命令来完成清除/var/log下的log文件这件事情:

更简单的清除日志方法是:

注意: /var/log/messages 记录系统报错信息 /var/log/wtmp 记录系统登录信息

在bash编程时,脚本通常都是放到一个文件里面,该文件可以有后缀名也可以没有,例如,你可以将该文件命名为cleanlog,然后在文件头声明一个命令解释器,这里是<code>#!/bin/bash</code>:

当然,还可以使用其他的命令行解释器,例如:

说明:

<code>#!</code> 后面的路径必须真实存在,否则运行时会提示<code>command not found的错误</code>。

在unix系统中,在<code>!</code>后边需要一个空格。

如果脚本中还包含有其他的<code>#!</code>行,那么bash将会把它看成是一个一般的注释行。

上面代码将/var/log定义为变量,这样会比把代码写死好很多,因为如果你可能想修改为其他目录,只需要修改变量的值就可以。

对于/var/log目录,一般用户没有访问权限,故需要使用root用户来运行上面脚本,另外,用户不一定有修改目录的权限,所以需要增强代码,做一些判断。

上面代码一样定义了一些变量,然后加了两个判断,去检查脚本运行中可能出现的错误并打印错误说明。如果脚本运行错误,则程序会退出并返回一个错误码,不同类型的错误对应的错误码不一样,这样便于识别错误原因;如果脚本运行正常,则正常退出,默认返回码为0。

对于<code>cd $log_dir</code>操作判断是否执行成功,更有效的做法是:

通常,我们可能不想全部清除日志,而是保留最后几行日志,这样就需要给脚本传入参数:

上面使用if else来判断是否有输入参数,一个更好的检测命令行参数的方式是使用正则表达式做判断,以检查输入参数的合法性:

编写完脚本之后,你可以使用<code>sh scriptname</code>或者<code>bash scriptname</code>来调用这个脚本。不推荐使用<code>sh &lt;scriptname</code>,因为这禁用了脚本从stdin中读数据的功能。更方便的方法是让脚本本身就具有 可执行权限,通过<code>chmod</code>命令可以修改。比如:

或者:

既然脚本已经具有了可执行权限,现在你可以使用<code>./scriptname</code>来测试这个脚本了。如果这个脚本以一个<code>#!</code>行开头,那么脚本将会调用合适的命令解释器来运行。

这样一个简单的脚本就编写完成并能运行了,从这个例子中,我们可以学到bash编程的一些代码规范:

使用变量

脚本运行中,需要做一些异常判断