-
-
Save GuyHoozdis/f93f77c44be99566effa48f447e864eb to your computer and use it in GitHub Desktop.
A template bash script based on google style guide with some little improvements
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Here short description of this script | |
# This is just a template to be used for writing new bash scripts | |
### | |
# Above all else, for the script utilities and applications you create aspire to: | |
# * Write small utilities with a singular focus, a limited scope, just one job. Do that job well. | |
# * Write utilities that are flexibile on how input is provided (e.g. pipes, redirection, ...) | |
# * Build application by composing these utilities or functions. | |
## | |
### | |
# Based on Google Style Guide: https://google.github.io/styleguide/shell.xml | |
# General remarks | |
# * Executables should have no extension (strongly preferred) or a .sh extension. | |
# * Libraries must have a .sh extension and should not be executable | |
# * SUID and SGID are forbidden on shell scripts. | |
# * ~All error messages should go to STDERR.~ Any output that not part of the utilities | |
# * Write todos like this: # TODO(renzok): Handle the unlikely edge cases (bug ####) | |
# * Indent 2 spaces. No tabs. 80 chars max per line | |
# * Put `; do` and `; then` on the same line as the `while`, `for`, or `if` statement. | |
# * Quoting: https://google.github.io/styleguide/shell.xml#Quoting | |
# * ~Function Names: Lower-case, with underscores to separate words.~ | |
# * Module level variable names are all caps. | |
# * Function scoped variables are lower case and use the `local` keyword. | |
# * Function names: lower-case with hypens or underscores. Just be consistent within a utility/library/application. | |
# ** Separate libraries with ::. Parentheses are required after the function name. | |
# * prefer shell builtin over separate process | |
## | |
## | |
# Coding tips and tricks: | |
# http://stackoverflow.com/questions/1167746/how-to-assign-a-heredoc-value-to-a-variable-in-bash | |
# | |
# Exit immediately if a command exits with a non-zero status. | |
# | |
# This might cause problems e.g. using read to read a heredoc cause | |
# read to always return non-zero set -o errexit Treat unset variables | |
# as an error when substituting. | |
set -o nounset | |
# 1. section: global constants (all words upper case separated by underscore) | |
# declare -r CONSTANT_VARIABLE='value' | |
declare -r TMP_FILE_PREFIX=${TMPDIR:-/tmp}/prog.$$ | |
# as per discussion | |
# http://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself | |
# but use BASH_SOURCE[0] | |
declare -r SCRIPTPATH=$( cd $(dirname ${BASH_SOURCE[0]}) > /dev/null; pwd -P ) | |
# 2. section: functions | |
# Part of a package/library | |
function mypackage::my_func() { | |
} | |
function _check_required_programs() { | |
# Required program(s) | |
req_progs=(readlink xmllint xsltproc curl date sed) | |
for p in ${req_progs[@]}; do | |
hash "${p}" 2>&- || \ | |
{ echo >&2 " Required program \"${p}\" not installed or in search PATH."; | |
exit 1; | |
} | |
done | |
} | |
function cleanup() { | |
rm -f ${TMP_FILE_PREFIX}.* | |
echo "always implement this" && exit 100 | |
} | |
function usage() { | |
cat <<EOF | |
Usage: $0 | |
TODO | |
EOF | |
} | |
# Single function | |
function main() { | |
# the optional parameters string starting with ':' for silent errors snd h for help usage | |
local -r OPTS=':h' | |
while builtin getopts ${OPTS} opt "${@}"; do | |
case $opt in | |
h) usage ; exit 0 | |
;; | |
\?) | |
echo ${opt} ${OPTIND} 'is an invalid option' >&2; | |
usage; | |
exit ${INVALID_OPTION} | |
;; | |
:) | |
echo 'required argument not found for option -'${OPTARG} >&2; | |
usage; | |
exit ${INVALID_OPTION} | |
;; | |
*) echo "Too many options. Can not happen actually :)" | |
;; | |
esac | |
done | |
cleanup | |
exit 0 | |
} | |
# Always check return values and give informative return values. | |
# see https://google.github.io/styleguide/shell.xml#Checking_Return_Values | |
# set a trap for (calling) cleanup all stuff before process | |
# termination by SIGHUBs | |
trap "cleanup; exit 1" 1 2 3 13 15 | |
# this is the main executable function at end of script | |
main "$@" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment