Shell Coding Convention
Improvements? Suggestions? email dna@hola.org
Coding conventions used by other companies: google
General
In general, most of C coding convention apply to Bash coding convention, for example:
- - Indentation is always one shift-width(4):
- - case has the same indentatio level and switch
- - ...
Function parameters
Function parameters should define local their names, not use $1, $2...
foo() { cp $1 $2 }
foo() { local src=$1 dst=$2 cp $src $dst }
returning a string value: RS="the value"
install_dir() { echo "/usr/local/bin" } install app.sh `install_dir`
install_dir() { RS="/usr/local/bin" } install_dir install app.sh $RS
returning an array value: RA=(the values...)
install_paths() { RA=(/usr/local/bin /usr/local /etc) } install_paths for p in "${RA[@]}"; do try_install "$p"; done
returning multiple string/array values
returning multiple string/array values use RS_{name}
or RA_{name}:
install_app() { RS_dir=/usr/local/bin RA_paths=(/usr/local/bin /usr/local /etc) } install_app try_install "$RS_dir" "${RA_paths[@]}"
argv handling and usage()
argv handling and usage(): use shift to process, and always have usage() function:
usage() { echo "usage: ..." exit 1 } while [ "${1:0:1}" = - ]; do case "$1" in --option) ... set option ... ;; --option-with-arg) shift if [ -z "$1" ]; then usage fi ... use *argv to set option ... ;; *) usage ;; esac shift done ... handle arguments left in argv ... if [ -n "$1" ]; then usage fi ... start working ...
Where integer operations are relevant
Where integer operations are relevant, use ((C_EXPRESSION)) instead of [SHELL_EXPRESSION]:
if [ "$prep_inc" == 1 ]; then enable_prep fi
if ((prep_inc)); then enable_prep fi
SHELL EXPRESSIONS
In SHELL EXPRESSIONS use [[ ]]
instead of [ ]
when AND/OR is needed:
if [ -z "$install_dir" -o ! -d "$install_dir" ]; do install_the_dir fi
if [[ -z "$install_dir" || ! -d "$install_dir" ]]; do install_the_dir fi
When the script is included in other scripts
When the script is included in other scripts, use the following method to avoid multiple includes:
if ((__FULL_PATH_FROM_PGK_FILENAME__)); then return 0 fi __FULL_PATH_FROM_PGK_FILENAME__=1 example: if ((__SYSTEM_SCRIPTS_JTOOLS_FUNCTIONS_SH__)); then return 0 fi __SYSTEM_SCRIPTS_JTOOLS_FUNCTIONS_SH__=1
Quotation:
the sign $@
is a special sign for all the parameters passed to the
function.
when quoting it "$@"
bash will quote each parameter seperatly.
if you want to use all the parameters, you should use an
array:cmd=("$@")
cmd=("${cmd[@]}" "some other text")
"${cmd[@]}"
The above three lines, save the parameters into an array, adds
to it another
value and then us it as a bash command.
Quotation should always take under consideration when passing
vars and arrays to other functions or when excecuted as a
command.