粗谈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 ...
随机推荐
- CocoaPods 更新慢&swift版本适配
一.更新慢的问题 使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动 原因在于当执行以上两个命令的 ...
- 代码中使用bitmap资源并加载到控件上
1.从res/drawable/XX.jpg里引用图片资源: 1. Resources res = getResources(); Bitmap inDrawable= BitmapFactory.d ...
- java系列--重载和覆盖小结
继承中属性的隐藏和方法的覆盖 java中规定,子类用于隐藏的变量可以和父类的访问权限不同,如果访问权限被改变,则以子类的权限为准 java中允许子类的变量与父类变量的类型完全不同, ...
- DP——由蒟蒻到神犇的进阶之路
开始更新咯 DP专题[题目来源BZOJ] 一.树形DP 1.bzoj2286消耗战 题解:因为是树形结构,一个点与根节点不联通,删一条边即可, 于是我们就可以简化这棵树,把有用的信息建立一颗虚树,然后 ...
- Angular - - ngChange、ngChecked、ngClick、ngDblclick
ngChange 当用户更改输入时,执行给定的表达式.表达式是立即进行执行的,这个和javascript的onChange事件的只有在触发事件的变化结束的时候执行不同. 格式:ng-change=”v ...
- iOS 协议
协议分为三部分:声明.引用.实现. 通常,声明协议和声明协议类型的属性都是在同一个类中.声明协议和声明协议作为属性在头文件中,引用在声明类的实现文件中.而实现协议则在其它类中.
- C语言的指针使用
今天老师总结了一下指针内容,感觉对理解指针有帮助, 1.大家在使用指针的时候容易忽略掉指针所在的位置. 假如定义一个变量int a=10: int *p: p=&a; //p中存放变量 ...
- oc是一个全动态语言,oc的一切都是基于runtime实现的!
oc是一个全动态语言,oc的一切都是基于runtime实现的! 从以下三方面来理解runtime吧! 1. 传统的面向过程的语言开发,例如c语言.实现c语言编译器很简单,只要按照语法规则实现一个LAL ...
- Intent的属性及Intent-filter配置——Data、Type属性与intent-filter配置
Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示: content://com.android.contacts/co ...
- Spring classPath:用法
http://blog.csdn.net/xing_sky/article/details/8228305 参考文章地址: http://hi.baidu.com/huahua035/item/ac8 ...