First of all, while they are functionally equivalent,
$(…) is widely considered to be clearer than `…` —
see thisthis, thisthis, and thisthis. Secondly,
you don’t need to use $? to check whether a command succeeded or failed.
My attention was recently drawn to Section 2.9.1, Simple Commands
of The Open Group Base Specifications for Shell & Utilities (Issue 7):
A "simple command" is a sequence of optional variable assignments and redirections, in any sequence, optionally followed by words and redirections, terminated by a control operator.
When a given simple command is required to be executed …
⋮ (blah, blah, blah …)
If there is a command name, execution shall continue as described in Command Search and Execution. If there is no command name, but the command contained a command substitution, the command shall complete with the exit status of the last command substitution performed. …
For example,
the exit status of the command
ls -ld "module_$(uname).c"
is the exit status from the ls, but
the exit status of the command
myfile="module_$(uname).c"
is the exit status from the uname.
So ferada’s answerferada’s answer can be streamlined a bit:
if output=$(/etc/grub.d/30_os-prober) && [ -z "$output" ]
# i.e., if 30_os-prober successfully produced no output
then
install_linux_only
else
install_dual_boot
fi
Note that it is good practice to use all-upper-case names only for environment variables (or variables to be visible throughout the script). Variables of limited scope are usually named in lower case (or, if you prefer, camelCase).