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.