To start a new script use this one-liner:
curl -Lo newscript.sh http://j.mp/bash-skeleton
#!/usr/bin/env bash | |
debug() { | |
if ((DEBUG)); then | |
echo "===> [${FUNCNAME[1]}] $*" 1>&2 | |
fi | |
} | |
list-commands() { | |
echo "available commands:" | |
sed -n 's/\(.*\)().*/ ::\1/p' ${BASH_SOURCE} \ | |
| grep -v 'main\|debug\|sed\|list-commands' \ | |
| sort | |
} | |
main() { | |
# if last arg is -d sets DEBUG | |
[[ ${@:$#} == -d ]] && { set -- "${@:1:$(($#-1))}" ; DEBUG=1 ; } || : | |
if [[ $1 =~ :: ]]; then | |
debug DIRECT-COMMAND ... | |
command=${1#::} | |
shift | |
$command "$@" | |
else | |
debug default-command | |
list-commands | |
fi | |
} | |
alias r=". $BASH_SOURCE" | |
[[ "$0" == "$BASH_SOURCE" ]] && main "$@" || true |
#!/bin/bash | |
set -eo pipefail | |
if [[ "$TRACE" ]]; then | |
: ${START_TIME:=$(date +%s)} | |
export START_TIME | |
export PS4='+ [TRACE $BASH_SOURCE:$LINENO][ellapsed: $(( $(date +%s) - $START_TIME ))] ' | |
set -x | |
fi | |
debug() { | |
[[ "$DEBUG" ]] && echo "-----> $*" 1>&2 | |
} | |
main() { | |
: ${DEBUG:=1} | |
} | |
[[ "$0" == "$BASH_SOURCE" ]] && main "$@" || true |