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.
mkdirbut applies to most command line utilities. – Kusalananda Apr 04 '19 at 10:50create_dir_if_neededlook like with an explicitreturn? If I simply putreturnbefore[ -d "$1" ], I get an error that saysreturn: [: numeric argument required. – Cameron Hudson Jan 15 '20 at 00:40returnorreturn "$?", but neither of these would be necessary and would only serve to confuse a reader. – Kusalananda Oct 31 '22 at 17:33