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.