There's a few things here.
- You very seldom have to explicitly check
$?
against anything or save it in a variable (unless you need to reference the same exit status multiple times).
- The exit status of a function is the exit status of the last executed command in the function, so an explicit
return
is seldom needed (seldom with an explicit return value at least).
- A function that checks whether a directory exists should not create any directories. Better call it
create_dir_if_needed
.
- There's an error in
[ result==0 ]
. The string result==0
is a string of non-zero length, and testing a string in this way will return true if the string has non-zero length, so the test is always true. You probably wanted [ "$result" -eq 0 ]
instead.
- Remember to always double quote variable expansions and command substitutions, unless you know in what contexts this is not needed.
With these things in mind:
create_dir_if_needed () {
mkdir -p -- "$1"
}
This would return the exit status of mkdir -p -- "$1"
. This command would create the named directory (and any intermediate directories) if this did not already exist. If the mkdir
command fails to create the directory, it will exit with a non-zero exit status, which will become the exit status of the function. mkdir -p
will not fail if the directory already exists.
You would use this as
if ! create_dir_if_needed "$dirpath"; then
printf 'Failed to create directory "%s"\n' "$dirpath" >&2
exit 1
fi
or, since the function is trivial, you could get rid of it and say
if ! mkdir -p -- "$dirpath"; then
printf 'Failed to create directory "%s"\n' "$dirpath" >&2
exit 1
fi
A variation of the create_dir_if_needed
function that uses mkdir
without -p
and will therefore never create missing parent directories to the given directory path:
create_dir_if_needed () {
if [ -d "$1" ]; then
return
fi
mkdir -- "$1"
}
or,
create_dir_if_needed () {
[ -d "$1" ] || mkdir -- "$1"
}
A call to this function would return true (zero) if the directory already existed or if the mkdir
call went well. A return
statement with no explicit value will return the exit status of the most recently executed statement, in this case it would return the positive outcome of the [ -d "$1" ]
test.