Getopts for Option Parsing
Uses getopts to parse command-line options with short flags, default values, and argument validation for building robust CLI tools in Bash.
Code
#!/usr/bin/env bash
set -euo pipefail
# Default values
verbose=false
output_dir="."
count=1
mode="default"
usage() {
echo "Usage: $0 [-v] [-o DIR] [-c NUM] [-m MODE] INPUT_FILE"
echo " -v Verbose output"
echo " -o DIR Output directory (default: .)"
echo " -c NUM Repeat count (default: 1)"
echo " -m MODE Processing mode (default|fast|slow)"
echo " -h Show this help message"
}
while getopts ":vo:c:m:h" opt; do
case "$opt" in
v) verbose=true ;;
o) output_dir="$OPTARG" ;;
c) count="$OPTARG"
[[ "$count" =~ ^[0-9]+$ ]] || { echo "Error: count must be a number" >&2; exit 1; }
;;
m) mode="$OPTARG"
[[ "$mode" =~ ^(default|fast|slow)$ ]] || { echo "Error: invalid mode" >&2; exit 1; }
;;
h) usage; exit 0 ;;
\?) echo "Error: invalid option: -$OPTARG" >&2; usage; exit 1 ;;
:) echo "Error: option -$OPTARG requires an argument" >&2; usage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
input_file="${1:-}"
if [[ -z "$input_file" ]]; then
echo "Error: input file required" >&2
usage
exit 1
fi
if [[ ! -f "$input_file" ]]; then
echo "Error: file not found: $input_file" >&2
exit 1
fi
mkdir -p "$output_dir"
if [[ "$verbose" == true ]]; then
echo "Config: file=$input_file, dir=$output_dir, count=$count, mode=$mode"
fi
for ((i=1; i<=count; i++)); do
if [[ "$verbose" == true ]]; then
echo "Processing iteration $i..."
fi
cp "$input_file" "$output_dir/output-${i}.txt"
done
echo "Done: $count files created in $output_dir"Report a problem with this exampleOpens a pre-filled issue on GitHub.