数百万开发人员编写shell脚本来解决各种类型的任务。我使用shell脚本来简化部署,生命周期管理,安装或简单地将其作为glue language。Shell脚本通用模板
我注意到没有人真正关心shell脚本的风格和质量。很多团队花了很多时间修复Java,C++,...样式问题,但完全忽略了他们的shell脚本中的问题。顺便说一下,在特定项目中通常没有实现shell脚本的标准方法,因此可能会发现许多不同的,丑陋的和错误的脚本,它们分布在代码库中。
为了在我的项目中克服这个问题,我决定创建一个通用的脚本模板,并且足够好。我将提供我的模板,以使这个问题更有用。开箱即用的这些模板提供:
- 命令行参数处理
- 同步
- 一些基本的帮助
参数处理:getopts的(最新版本:[email protected])
#!/bin/bash
# ------------------------------------------------------------------
# [Author] Title
# Description
# ------------------------------------------------------------------
VERSION=0.1.0
SUBJECT=some-unique-id
USAGE="Usage: command -ihv args"
# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
echo $USAGE
exit 1;
fi
while getopts ":i:vh" optname
do
case "$optname" in
"v")
echo "Version $VERSION"
exit 0;
;;
"i")
echo "-i argument: $OPTARG"
;;
"h")
echo $USAGE
exit 0;
;;
"?")
echo "Unknown option $OPTARG"
exit 0;
;;
":")
echo "No argument value for option $OPTARG"
exit 0;
;;
*)
echo "Unknown error while processing options"
exit 0;
;;
esac
done
shift $(($OPTIND - 1))
param1=$1
param2=$2
# --- Locks -------------------------------------------------------
LOCK_FILE=/tmp/$SUBJECT.lock
if [ -f "$LOCK_FILE" ]; then
echo "Script is already running"
exit
fi
trap "rm -f $LOCK_FILE" EXIT
touch $LOCK_FILE
# --- Body --------------------------------------------------------
# SCRIPT LOGIC GOES HERE
echo $param1
echo $param2
# -----------------------------------------------------------------
Shell Flags(shFlags)允许简化处理很多的命令行参数,所以在某个时刻我决定不会忽略这种可能性。
参数处理:shflags(最新版本:[email protected])
#!/bin/bash
# ------------------------------------------------------------------
# [Author] Title
# Description
#
# This script uses shFlags -- Advanced command-line flag
# library for Unix shell scripts.
# http://code.google.com/p/shflags/
#
# Dependency:
# http://shflags.googlecode.com/svn/trunk/source/1.0/src/shflags
# ------------------------------------------------------------------
VERSION=0.1.0
SUBJECT=some-unique-id
USAGE="Usage: command -hv args"
# --- Option processing --------------------------------------------
if [ $# == 0 ] ; then
echo $USAGE
exit 1;
fi
. ./shflags
DEFINE_string 'aparam' 'adefault' 'First parameter'
DEFINE_string 'bparam' 'bdefault' 'Second parameter'
# parse command line
FLAGS "[email protected]" || exit 1
eval set -- "${FLAGS_ARGV}"
shift $(($OPTIND - 1))
param1=$1
param2=$2
# --- Locks -------------------------------------------------------
LOCK_FILE=/tmp/${SUBJECT}.lock
if [ -f "$LOCK_FILE" ]; then
echo "Script is already running"
exit
fi
trap "rm -f $LOCK_FILE" EXIT
touch $LOCK_FILE
# -- Body ---------------------------------------------------------
# SCRIPT LOGIC GOES HERE
echo "Param A: $FLAGS_aparam"
echo "Param B: $FLAGS_bparam"
echo $param1
echo $param2
# -----------------------------------------------------------------
我认为这些模板可以提高到更简化开发者的工作。
所以现在的问题是如何提高他们具备以下条件:
- 内置记录
- 更好的错误处理
- 更好的便携性
- 更小的尺寸
- 内置的执行时间跟踪
您正在寻求提供涵盖所有可能性的模板;麻烦,任何给定的脚本不需要涵盖所有可能性。你说得对,很多shell脚本都是非常糟糕的(当我看到在我工作的代码库中的Bourne/Korn/Bash脚本中有if(test -f“$ file”)'时,我会畏缩 - 有时可以修复它尽管没有这样做的许可)。但是,从经验来看,模板中足够的样板变得无用。我以前有100行模板;我现在有10个线模板。从长远来看,它们更有用 - 对我来说。举例说明是很好的。 –
是的,我同意。最好是说我对元模板感兴趣,并将其用作特定项目中的骨架。基本上,这个想法是让所有项目脚本均匀,所以需要一些构建块。这些块可以是可选的,因此对于具体项目将提供20行模板。 –
不要说“没有人”!我非常关心shell脚本的质量,并且经常被现有代码吓倒。 –