Миллионы разработчиков пишут сценарии оболочки для решения различных задач. Я использую shell-скрипты для упрощения развертывания, управления жизненным циклом, установки или просто как язык клея.
Что я заметил, никто не заботится о стиле и качестве скриптов оболочки. Многие команды тратят много часов на исправление проблем стиля Java, С++,..., но полностью игнорируют проблемы в своих сценариях оболочки. Кстати, обычно нет стандартного способа реализации оболочки script в рамках конкретного проекта, поэтому можно найти десятки разных, уродливых и багги-скриптов, распространяемых вокруг кодовой базы.
Чтобы преодолеть эту проблему в моих проектах, я решил создать шаблон оболочки script, универсальный и достаточно хороший. Я предоставлю свои шаблоны, чтобы сделать этот вопрос более полезным. Из этих шаблонов вы можете:
- Обработка аргументов командной строки
- синхронизация
- Основная помощь
Обработка аргументов: 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
# -----------------------------------------------------------------
Флаги Shell (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 "[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
# -----------------------------------------------------------------
Я думаю, что эти шаблоны можно улучшить, чтобы еще больше упростить жизнь разработчика.
Итак, вопрос заключается в том, как улучшить их, чтобы иметь следующее:
- встроенный журнал
- улучшенная обработка ошибок
- улучшенная переносимость
- меньший размер
- встроенное отслеживание времени выполнения