#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: clamp NUMBER MIN MAX clamp -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message Clamp the NUMBER between MIN and MAX. EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) assert_arg() { if [ -z "$1" ]; then printf 'Missing %s\n\n' "$2" >&2 usage >&2 exit 2 fi } NUMBER="${1:-}" MIN="${2:-}" MAX="${3:-}" assert_arg "$NUMBER" 'NUMBER' assert_arg "$MIN" 'MIN' assert_arg "$MAX" 'MAX' if [ "$MIN" -gt "$MAX" ]; then printf 'MIN (%s) is greater then MAX (%s).\n' "$MIN" "$MAX" >&2 exit 2 fi min -- "$(max -- "$NUMBER" "$MIN")" "$MAX"