高级Bash脚本编程入门
最近在看《Advanced Bash Scripting Guide》这本书,第二章举了一个清除日志的例子,来讲述如何使用Bash进行编程并聊到了一些编程规范。本文主要是基于这部分内容记录我的读书笔记并整理一些相关知识点。
说到清除日志,你可以使用下面命令来完成清除/var/log下的log文件这件事情:
cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
更简单的清除日志方法是:
echo "" >messages
#或者
>messages
注意: /var/log/messages 记录系统报错信息 /var/log/wtmp 记录系统登录信息
在Bash编程时,脚本通常都是放到一个文件里面,该文件可以有后缀名也可以没有,例如,你可以将该文件命名为cleanlog,然后在文件头声明一个命令解释器,这里是#!/bin/bash
:
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
exit
当然,还可以使用其他的命令行解释器,例如:
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f#自删除脚本
#!/bin/rm
说明:
#!
后面的路径必须真实存在,否则运行时会提示Command not found的错误
。- 在UNIX系统中,在
!
后边需要一个空格。 - 如果脚本中还包含有其他的
#!
行,那么bash将会把它看成是一个一般的注释行。
上面代码将/var/log定义为变量,这样会比把代码写死好很多,因为如果你可能想修改为其他目录,只需要修改变量的值就可以。
对于/var/log目录,一般用户没有访问权限,故需要使用root用户来运行上面脚本,另外,用户不一定有修改目录的权限,所以需要增强代码,做一些判断。
#!/bin/bashLOG_DIR=/var/log
ROOT_UID=0
LINES=50
E_XCD=66
E_NOTROOT=67# 当然要使用root 用户来运行.
if [ "$UID" -ne "$ROOT_UID" ]
thenecho "Must be root to run this script."exit $E_NOTROOT
ficd $LOG_DIRif[ "$PWD" != "$LOG_DIR" ]
thenecho "Can't change to $LOG_DIR."exit $E_XCD
ficat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."#返回0表示成功
exit 0
上面代码一样定义了一些变量,然后加了两个判断,去检查脚本运行中可能出现的错误并打印错误说明。如果脚本运行错误,则程序会退出并返回一个错误码,不同类型的错误对应的错误码不一样,这样便于识别错误原因;如果脚本运行正常,则正常退出,默认返回码为0。
对于cd $LOG_DIR
操作判断是否执行成功,更有效的做法是:
#使用或操作替代if else判断
cd /var/log || {echo "Cannot change to necessary directory." >&2exit $E_XCD
}
通常,我们可能不想全部清除日志,而是保留最后几行日志,这样就需要给脚本传入参数:
#!/bin/bashLOG_DIR=/var/log
ROOT_UID=0
LINES=50
E_XCD=66
E_NOTROOT=67# 当然要使用root 用户来运行.
if [ "$UID" -ne "$ROOT_UID" ]
thenecho "Must be root to run this script."exit $E_NOTROOT
ficd $LOG_DIRif[ "$PWD" != "$LOG_DIR" ]
thenecho "Can't change to $LOG_DIR."exit $E_XCD
fi# 测试是否有命令行参数,非空判断
if [ -n "$1" ]
thenlines=$1
elselines=$LINES # 默认,如果不在命令行中指定
fi# 保存log file消息的最后部分
tail -$lines messages > mesg.temp
mv mesg.temp messagescat /dev/null > wtmp
echo "Logs cleaned up."#返回0表示成功
exit 0
上面使用if else来判断是否有输入参数,一个更好的检测命令行参数的方式是使用正则表达式做判断,以检查输入参数的合法性:
E_WRONGARGS=65 # 非数值参数(错误的参数格式)case "$1" in"" ) lines=50;;*[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;; * ) lines=$1;;
esac
编写完脚本之后,你可以使用sh scriptname
或者bash scriptname
来调用这个脚本。不推荐使用sh <scriptname
,因为这禁用了脚本从stdin中读数据的功能。更方便的方法是让脚本本身就具有 可执行权限,通过chmod
命令可以修改。比如:
chmod 555 scriptname #允许任何人都具有可读和执行权限
或者:
chmod +rx scriptname #允许任何人都具有可读和执行权限
chmod u+rx scriptname #只给脚本的所有者可读和执行权限
既然脚本已经具有了可执行权限,现在你可以使用./scriptname
来测试这个脚本了。如果这个脚本以一个#!
行开头,那么脚本将会调用合适的命令解释器来运行。
这样一个简单的脚本就编写完成并能运行了,从这个例子中,我们可以学到bash编程的一些代码规范:
- 使用变量
- 脚本运行中,需要做一些异常判断
除此之外,google公司还定义了一份Shell Style Guide,可以仔细阅读并约束自己去遵循这些规范。
高级Bash脚本编程入门相关推荐
- 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese
<Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...
- bash脚本编程入门_Bash编程入门
bash脚本编程入门 对Unix的最初希望之一是,它将使日常的计算机用户能够微调其计算机以适应其独特的工作风格. 在过去的几十年中,对计算机定制的期望已经降低,许多用户将他们收集的应用程序和网站视为他 ...
- 高级bash脚本编程(1)
知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 -o exp2 如果 ...
- 高级shell脚本编程之函数库、信号与陷进、文件处理、数组、安全性
高级shell脚本编程之函数库.信号与陷进.文件处理.数组.安全性 1.函数库 把所有需要用到的函数都放到一个文件中,然后每个脚本的开头包含这个文件.例如: #!/bin/sh scope(){ lo ...
- Bash脚本编程之算术运算
简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...
- python利器怎么编程-Linux 利器- Python 脚本编程入门(一)
导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会 ...
- php shell脚本怎么写,Shell脚本编程入门
一.什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do tou ...
- Linux 利器- Python 脚本编程入门(一)
导读 众所周知,系统管理员需要精通一门脚本语言,而且招聘机构列出的职位需求上也会这么写.大多数人会认为 Bash (或者其他的 shell 语言)用起来很方便,但一些强大的语言(比如 Python)会 ...
- linux的逻辑运算参数,Linux基础之bash脚本编程初级-逻辑运算与测试
引言 前面介绍了bash编程的基础变量与算术表达式,本文介绍在脚本中的进阶知识:测试 在bash中测试大体分两部分:条件测试.组合测试. 而条件测试又分:数值测试.字符串测试.文件测试. 组合测试则有 ...
- linux bash脚本编程知识点
bash变量类型: 环境变量 本地变量(局部变量) 位置变量 特殊变量 本地变量: set VARNAME=VALUE: 作用域为整个bash进程: 引用变量 $(varname) 局部变量: loc ...
最新文章
- oracle伪客户端的安装(oracle不安装客户端)
- c带gui的图书馆管理系统_定了!区图书馆24小时城市书屋即将在这天正式对外开放...
- jQuery如何实现表单的自动提示
- spring @bean 自动创建容器对象的原理
- python实现宿舍管理系统_基于PYTHON微信小程序的病历管理系统的设计与实现
- linux 查看opengl版本,linux下查看OpenGL版本
- 小学经历——我家有猪
- PAM+4+matlab,基于PAM4调制的400G光模块
- 计算机程序设计a,计算机程序设计 A(1620401)
- bigdata是什么
- 网络基础---网络层
- 百度地图ipa包使用的Framework解读
- win10安装steam有损计算机,Win10专业版修复Steam磁盘写入错误的方法
- substance Pt 工业基础配色及金属配色ID材质
- 超全!SLAM论文与开源代码汇总(激光+视觉+融合)
- Windows10 家庭版关闭安全中心(defender)
- CFD(计算流体动力学)在直升机中的应用
- Webpack 中 CSS 压缩插件
- qq侧滑界面的实现(DreawerLayout)
- 自制的万年历收音机功能完工。