#!/bin/sh set -eu get_b() { # VCP 10 C 100 100 read -r vcp feat c val max <<-EOF $(ddcutil -t getvcp 10) EOF printf '%s' ${val} return 0 } set_b() { local b=${1} shift 1 ddcutil setvcp 10 ${b} return 0 } inc_b() { local d=${1} shift 1 local b= b=$(($(get_b) + ${d})) if [ ${b} -gt 100 ]; then b=100 elif [ ${b} -lt 0 ]; then b=0 fi set_b ${b} } tog_b() { local b= b=$(get_b) case ${b} in [0-9] | [1-4][0-9]) set_b 100;; [5-9][0-9] | 100) set_b 0;; esac return 0 } usage() { printf 'Usage: %s {|}\n' "${0}" printf '\n' printf 'Where is any word beginning with (in any case):\n' printf ' * "U" for up\n' printf ' * "D" for down\n' printf ' * "T" for toggle (between 0 and 100)\n' printf 'And is any integer between 0 and 100 inclusive\n' return 0 } main() { local dir= if [ ${#} -ne 1 ]; then usage 1>&2 return 1 fi dir="${1}" shift 1 case "${dir}" in [Uu]*) inc_b 20;; [Dd]*) inc_b -20;; [Tt]*) tog_b;; *[!0-9]* | '') usage 1>&2 return 1 ;; *) set_b ${dir} esac return 0 } main "${@}"