#!/usr/bin/env bash set -euo pipefail usage() { cat <<'USAGE' Usage: render_template.sh TEMPLATE --set key=value ... [-o output] USAGE } if [[ $# -lt 1 ]]; then usage >&2 exit 2 fi template="$1" shift output="" declare -A values while [[ $# -gt 0 ]]; do case "$1" in --set) shift if [[ $# -eq 0 ]]; then echo "--set requires key=value" >&2 exit 2 fi if [[ "$1" != *=* ]]; then echo "Invalid --set value (expected key=value): $1" >&2 exit 2 fi key="${1%%=*}" val="${1#*=}" if [[ -z "$key" ]]; then echo "Invalid --set value (empty key): $1" >&2 exit 2 fi values["$key"]="$val" shift ;; -o|--output) shift if [[ $# -eq 0 ]]; then echo "-o/--output requires a path" >&2 exit 2 fi output="$1" shift ;; -h|--help) usage exit 0 ;; *) echo "Unknown argument: $1" >&2 usage >&2 exit 2 ;; esac done if [[ ${#values[@]} -eq 0 ]]; then echo "No values provided. Use a JSON file or --set key=value." >&2 exit 2 fi rendered="$(cat "$template")" for key in "${!values[@]}"; do val="${values[$key]}" rendered="$(printf '%s' "$rendered" | sed -E "s/\{\{[[:space:]]*$key[[:space:]]*\}\}/$val/g")" done if [[ -n "$output" ]]; then printf '%s' "$rendered" > "$output" else printf '%s' "$rendered" fi