Build a Reusable Bash Script Template
Summary: Create templates with structure and help menus.
Writing Bash scripts can streamline tasks, but starting from scratch every time is tedious. A template with built-in argument parsing, error handling, and a helpful help menu ensures your scripts are robust, consistent, and easy to maintain. In this post, you'll learn how to create a reusable Bash script template.
Why Use a Script Template?
A good script template:
- Saves Time: No need to reinvent boilerplate code.
- Reduces Bugs: Common features (parsing, help menus, error handling) are pre-tested.
- Improves Consistency: Uniform scripts across different projects.
Let’s build such a template, explain each part, and see how you can reuse it.
The Template: A Solid Foundation
Below is a well-structured Bash script template. No external dependencies, fully portable.
#!/usr/bin/env bash
# =============================================================================
# SCRIPT NAME: script_template.sh
# DESCRIPTION: Brief explanation of what this script does.
#
# USAGE: ./script_template.sh [-h] [-v] [-f <filename>]
#
# OPTIONS:
# -h Display this help message and exit
# -v Enable verbose mode
# -f <file> Specify an input file
#
# EXAMPLES:
# ./script_template.sh -v -f data.txt
#
# AUTHOR: Your Name
# VERSION: 1.0.0
# ============================================================================
set -euo pipefail
# ---------------------------
# Global Variables
# ---------------------------
VERBOSE=0
INPUT_FILE=""
# ---------------------------
# Functions
# ---------------------------
usage() {
grep '^#' "$0" | cut -c 3-
exit 0
}
error_exit() {
echo "Error: $1" >&2
exit 1
}
log() {
if [[ $VERBOSE -eq 1 ]]; then
echo "[INFO] $*"
fi
}
# ---------------------------
# Parse Arguments
# ---------------------------
while getopts ":hvf:" opt; do
case ${opt} in
h )
usage
;;
v )
VERBOSE=1
;;
f )
INPUT_FILE="$OPTARG"
;;
\? )
error_exit "Invalid option: -$OPTARG. Use -h for help."
;;
: )
error_exit "Option -$OPTARG requires an argument."
;;
esac
done
shift $((OPTIND -1))
# ---------------------------
# Main Script
# ---------------------------
main() {
if [[ -z "$INPUT_FILE" ]]; then
error_exit "Input file not specified. Use -f <file>."
fi
log "Processing file: $INPUT_FILE"
# Add your main logic here
# Example:
# cat "$INPUT_FILE"
}
main "$@"
Key Template Features
1. Shebang and Safe Mode
#!/usr/bin/env bash
set -euo pipefail
- Ensures portability and that your script aborts on errors or unset variables.
2. Auto-Generated Help
The usage function extracts all help text from the comments at the top of the script using grep. Change or expand these comments, and your help menu automatically updates.
3. Argument Parsing
Using getopts, the script natively supports common flags:
-h: Help-v: Verbose logging-f: Input file
Easily extend for more options as needed.
4. Logging and Error Handling
- The
logfunction prints messages only when verbose mode is enabled. - The
error_exitfunction centralizes error reporting and ensures the script halts as soon as an error occurs.
5. Main Execution Flow
Encapsulating your main logic in a main() function improves readability and manageability of larger scripts.
Customizing the Template
- Add New Options: Extend the
getoptscase with new flags. - Additional Functions: Place utility functions in the Functions section.
- Expand Usage Block: Add documentation to the comments at the script's top.
Reusing Your Template
-
Save the template as
script_template.shin a scripts directory. -
Copy it whenever you need a new script:
cp script_template.sh my_new_script.sh chmod +x my_new_script.sh -
Edit the header, adjust options, and insert your logic.
Conclusion
A reusable Bash script template with argument parsing, help menus, error management, and a logical structure is indispensable for productivity and reliability. Start with this foundation, and adapt it to your needs—the benefits scale with each project you tackle!
Happy scripting! 🐧
Further Reading
- Bash Reference Manual
- BashGuide at Greg’s Wiki
- ShellCheck (for script linting)