#!/bin/bash -e
# template for bash scripts
# internal use only
append_msg( ) {
if test $# -ne 0; then
echo -en " :\e[0m \e[1m $* "
fi
echo -e "\e[0m"
}
# write a notice
notice( ) {
if test $# -eq 0; then
return
fi
echo -e " \e[1m $* \e[0m " 1>& 2
}
# write error message
error( ) {
echo -en "\e[1;31merror" 1>& 2
append_msg $* 1>& 2
}
# write a warning message
warning( ) {
echo -en "\e[1;33mwarning" 1>& 2
append_msg $* 1>& 2
}
# write a success message
success( ) {
echo -en "\e[1;32msuccess" 1>& 2
append_msg $* 1>& 2
}
# commandline parameter evaluation
while test $# -gt 0; do
case " $1 " in
( --help| -h) less <<EOF
SYNOPSIS
$0 [ OPTIONS]
OPTIONS
--help, -h show this help
DESCRIPTION
EOF
exit; ;
( *) error " unknow option $1 , try $0 --help " ; exit 1; ;
esac
if test $# -eq 0; then
error " missing parameter, try $0 --help " ; exit 1
fi
shift;
done
# run a command, print the result and abort in case of error
# option: --no-check: ignore the result, continue in case of error
run( ) {
check = 1
while test $# -gt 0; do
case " $1 " in
( --no-check) check = 0; ;
( *) break; ;
esac
shift;
done
echo -en " \e[1m-> running:\e[0m $* ... "
result = $( $* 2>& 1)
res = $?
if test $res -ne 0; then
if test $check -eq 1; then
error " failed with return code: $res "
if test -n " $result " ; then
echo " $result "
fi
exit 1
else
warning " ignored return code: $res "
fi
else
success
fi
}
# error handler
function traperror( ) {
set +x
local err = ( $1 ) # error status
local line = " $2 " # LINENO
local linecallfunc = " $3 "
local command = " $4 "
local funcstack = " $5 "
for e in ${ err [@] } ; do
if test -n " $e " -a " $e " != "0" ; then
error " line $line - command ' $command ' exited with status: $e ( ${ err [@] } ) "
if [ " ${ funcstack } " != "main" -o " $linecallfunc " != "0" ] ; then
echo -n " ... error at ${ funcstack } "
if [ " $linecallfunc " != "" ] ; then
echo -n " called at line $linecallfunc "
fi
echo
fi
exit $e
fi
done
success
exit 0
}
# catch errors
trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT
##########################################################################################