何百万もの開発者が、さまざまなタイプのタスクを解決するためのシェルスクリプトを作成しています。私はシェルスクリプトを使用して、展開、ライフサイクル管理、インストールを簡素化するか、単にグルー言語として使用しています。
私が気付いたのは、シェルスクリプトのスタイルと品質を実際に気にする人は誰もいないということです。多くのチームは、Java、C ++、...スタイルの問題の修正に多くの時間を費やしていますが、シェルスクリプトの問題を完全に無視しています。ちなみに、通常、特定のプロジェクト内にシェルスクリプトを実装する標準的な方法はありません。そのため、コードベース全体に数十の異なる、醜くバグのあるスクリプトが散在している場合があります。
私のプロジェクトでその問題を克服するために、私は、普遍的で十分に優れたシェルスクリプトテンプレートを作成することにしました。この質問をもう少し便利にするために、テンプレートをそのまま提供します。箱から出して、これらのテンプレートは以下を提供します:
- コマンドライン引数の処理
- 同期
- いくつかの基本的なヘルプ
引数の処理:getopts(最新バージョン:shell-script-template @ github)
#!/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
# -----------------------------------------------------------------
シェルフラグ(shFlags)を使用すると、コマンドライン引数の処理を大幅に簡素化できるため、ある時点で、そのような可能性を無視しないことにしました。
引数の処理:shflags(最新バージョン:shell-script-template @ github)
#!/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 "$@" || 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
# -----------------------------------------------------------------
これらのテンプレートは、開発者の生活をさらに簡素化するために改善できると思います。
したがって、問題は、次のようにそれらを改善する方法です。
- 組み込みのロギング
- より良いエラー処理
- 移植性の向上
- フットプリントが小さい
- 組み込みの実行時間追跡