To check if a program exists in a Bash script, use the command -v built-in command, which is POSIX-compliant and reliable. Here’s how to implement it:
Check if a Program Exists
if command -v <program_name> &> /dev/null; then
echo "<program_name> exists"
else
echo "Error: <program_name> is not installed" >&2
exit 1
fi
Example (check for curl):
if command -v curl &> /dev/null; then
echo "curl is installed"
else
echo "curl is not installed" >&2
exit 1
fi
Explanation
command -v:
- Returns the path to the executable if it exists in
$PATH. - Works for built-in commands, aliases, and external programs.
- Exits with code
0(success) if the program exists,1(failure) otherwise.
&> /dev/null:
- Silences both
stdoutandstderrto avoid unwanted output.
exit 1:
- Terminates the script with an error code if the program is missing.
Why Avoid which or type?
which:- Not POSIX-compliant and may behave inconsistently across systems.
- Only checks for external executables (ignores built-ins).
type:- Bash-specific (not guaranteed in all shells).
- Output parsing is error-prone.
Check for Executability
To ensure the program is executable, add a secondary check:
program_path=$(command -v <program_name>)
if [[ -x "$program_path" ]]; then
echo "<program_name> is executable"
fi
Examples in Action
1. Check for git:
if command -v git &> /dev/null; then
echo "Git is installed at $(command -v git)"
else
echo "Git is required but not installed." >&2
exit 1
fi
2. Check for docker and docker-compose:
for cmd in docker docker-compose; do
if ! command -v "$cmd" &> /dev/null; then
echo "Error: $cmd is not installed" >&2
exit 1
fi
done
Key Takeaways
- Use
command -vfor portable and reliable checks. - Redirect output to
/dev/nullto suppress messages. - Always handle missing dependencies gracefully in scripts.