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.

BashCli Tooling

Code

snippet
#!/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"