粗谈shell脚本风格
注意:此风格并非官方版本,为个人在编写和维护脚本程序时总结出来的民间版本。
0. 开头:
除去开头的#!/bin/bash,最前面的就是脚本描述注释了,视个人喜好而定,例如:
###############################################################
# author :skyline
# args :name => 名称,age => 年龄(optional) ...
# desc :这是这个脚本的描述,
# charactor:UTF-
# note :email => skyline1225@.com,(TODO something have not done)
###############################################################
......
1.初始化参数和环境变量
这一步主要对环境变量和参数进行初始化,还有对环境的设置,例如:
set -e
DIR=`pwd`
LOG=$DIR/test.log
NAME=$
WORKSPACE=/home/$NAME
一般声明常量都用大写,变量小写,这个不用多说
2.参数检查
在初始化参数和环境后,就是检查,如果有问题就打印log退出或者提示退出
help()
{
cat << HELP
Usage:./test.sh [name]
this script is to print name
h,--help display this help and exit HELP
exit
}
[ "$1" = "h" -o "$1" = "--help" -o ! $# -eq ] && help
或者
echo "test args..."
test "$name" != "" && echo "name is right,continue" || (echo "name is wrong:$age,exit" && exit )
test "$age" != "" && echo "age is right,continue" || (echo "age is wrong:$age,exit" && exit )
test "$WORKSPCE" != "" && echo "age is right,continue" || (echo "age is wrong:$age,exit" && WORKSPCE=/home/$name)
如果脚本是人为执行的,那么倾向前一种,将提示信息写得越全越友好,如果可以实现标准化的参数标志就更好了;
本人做的工作中脚本大都是自动由程序调用,因此用后面那种较多,打印信息完整,而且修改时打印可以当注释用,尽量简短,一般3~5个单词,整行保持一个屏幕宽度内。
3.完成实际工作
通常我写脚本会控制大小,9-10号字体,一张A4纸大小,鼠标滚轮一下滚到底,最多不超过100行,最多嵌套3层。如果要超过,说明有些功能可以分离出去了。
通常脚本大体功能为循环结构,顺序结构或者分支结构。
循环结构不用说,直接for或者while
for (( i = ; i < ; i++ )); do
#statements
done
如果分支结构,条件写得一目了然,尽量不要分支嵌套,出现那种嵌套地狱
if [[ condition ]]; then
#statements
elif [[ condition ]]; then
#statements
else
#statements
fi
总体顺序执行脚本部分,也可能出现在循环和分支中,偏向使用test , && , || , | 的方式,打印当注释,感觉很多情况横着看比竖着看要方便些,例如:
src_dir=`echo "get src_dir from config" && cat $config_file | grep "src:" | cut -d ':' -f `
echo "cp src_dir or not..." && test -f $src_dir && cp $src_dir ./tmp_dir || (echo "cp src_dir failed,exit" && exit )
其他:
关于function,在包含业务的脚本中写function,可以把function写纯,约定个返回方式,然后单独分到一个脚本里;
bash shell的表达能力有限,如果产品中有一些比较复杂的业务逻辑,还想用脚本,还打算扩展的,还是移步python或perl等脚本语言吧,shell脚本一长就很难看了;
如果有什么优雅的shell脚本写法,可以email至skyline1225@163.com,谢谢!
粗谈shell脚本风格的更多相关文章
- 浅谈自底向上的Shell脚本编程及效率优化
作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...
- Shell脚本编程的常识
(这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d 目录 ...
- shell脚本编程常识
(这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d 目录 ...
- SHELL脚本编程的常识和VI常用技巧
来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- Linux Shell 脚本调试
方法如下所示:(1) 使用选项–x,启用shell脚本的跟踪调试功能: $ bash -x script.sh 运行带有-x标志的脚本可以打印出所执行的每一行命令以及当前状态.注意,你也可以使用sh ...
- shell脚本编程-循环(for、while、until)
for命令格式:– list参数:迭代中要用的一系列值– 每个迭代中,变量var会包含列表中的当前值– do和done语句之间输入的命令可以是一条或多条标准的bash shell命令 1 2 3 ...
- Linux Shell脚本编程的注意事项
Linux下(Shell脚本 http://www.jbxue.com/jb/shell/)编程的一些注意事项,如编程风格.命名风格等. 一.常用技巧 ssh user@server bash < ...
- shell脚本入门
什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...
随机推荐
- javascript-函数声明和函数表达式-call-apply
1.函数声明与函数表达式 <script type="text/javascript"> //函数表达式,解析器在像执行环境中加载数据时,函数表达式是解析器执行到这段代 ...
- Js把IE COM数组列表转换成数组
今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...
- centos5.5關閉ssh保留運行的程序
SSH会话关闭时,ssh所关联的pty关闭,系统会给这个pty所关联的session中的所有进程发送SIGHUP信号, SIGHUP的默认信号处理程序是终止进程,除非进程自己处理了SIGHUP. 解决 ...
- box-sizing
Over the generations, people realized that math is not fun, so a new CSS property called box-sizing ...
- iOS 程序初始一个带导航栏的视图
@synthesize window = _window; @synthesize rootViewController = _rootViewController; - (BOOL)applicat ...
- EF Code First:实体映射
二.实体映射 实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: (一) DataAnnotation DataAnnotation 特性由.NET 3.5 ...
- swift webView的高度自适应内容
废话不多 直接上代码 //在webView的协议方法里实现以下代码 func webViewDidFinishLoad(webView: UIWebView) {//加载完成 // se ...
- JSP获取绝对物理地址
session.getServletContext().getRealPath(""); 但是 getRealPath("a"+File.separator); ...
- js事件对象
哎,事件也有对象呦.程序员一直在讲对象对象,那么,过年是不是该带个对象回家呢?好了,既然事件有对象,承认这个事实吧!哈哈,那么,其就有属性,接下来,就放个 例子来讲讲,顺便把常用的属性也添加进去.. ...
- 微信小程序----关于变量对象data 和 前端wxml取后台js变量值
(一)页面变量对象data 对象data 有两个方面用途 第一,前端wxml的数据渲染是通过设置此对象中定义的变量进行关联展现的 第二,定义JS页面中的页面局部变量,使其整个页面中可使用或调用 对象d ...