注意:此风格并非官方版本,为个人在编写和维护脚本程序时总结出来的民间版本。
0. 开头:
除去开头的#!/bin/bash,最前面的就是脚本描述注释了,视个人喜好而定,例如:
1 ############################################################### 2 # author :skyline 3 # args :name => 名称,age => 年龄(optional) ... 4 # desc :这是这个脚本的描述, 5 # charactor:UTF-8 6 # note :email => skyline1225@163.com,(TODO something have not done) 7 ############################################################### 8 ......
1.初始化参数和环境变量
这一步主要对环境变量和参数进行初始化,还有对环境的设置,例如:
1 set -e 2 DIR=`pwd` 3 LOG=$DIR/test.log 4 NAME=$1 5 WORKSPACE=/home/$NAME
一般声明常量都用大写,变量小写,这个不用多说
2.参数检查
在初始化参数和环境后,就是检查,如果有问题就打印log退出或者提示退出
1 help() 2 { 3 cat << HELP 4 Usage:./test.sh [name] 5 this script is to print name 6 h,--help display this help and exit 7 8 HELP 9 exit 1 10 } 11 [ "$1" = "h" -o "$1" = "--help" -o ! $# -eq 1 ] && help
或者
1 echo "test args..." 2 test "$name" != "" && echo "name is right,continue" || (echo "name is wrong:$age,exit" && exit 1) 3 test "$age" != "" && echo "age is right,continue" || (echo "age is wrong:$age,exit" && exit 1) 4 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
1 for (( i = 0; i < 10; i++ )); do 2 #statements 3 done
如果分支结构,条件写得一目了然,尽量不要分支嵌套,出现那种嵌套地狱
1 if [[ condition ]]; then 2 #statements 3 elif [[ condition ]]; then 4 #statements 5 else 6 #statements 7 fi
总体顺序执行脚本部分,也可能出现在循环和分支中,偏向使用test , && , || , | 的方式,打印当注释,感觉很多情况横着看比竖着看要方便些,例如:
1 src_dir=`echo "get src_dir from config" && cat $config_file | grep "src:" | cut -d ':' -f 2 ` 2 echo "cp src_dir or not..." && test -f $src_dir && cp $src_dir ./tmp_dir || (echo "cp src_dir failed,exit" && exit 1)
其他:
关于function,在包含业务的脚本中写function,可以把function写纯,约定个返回方式,然后单独分到一个脚本里;
bash shell的表达能力有限,如果产品中有一些比较复杂的业务逻辑,还想用脚本,还打算扩展的,还是移步python或perl等脚本语言吧,shell脚本一长就很难看了;
如果有什么优雅的shell脚本写法,可以email至skyline1225@163.com,谢谢!