# [Linux] Bash script adjusting screen brightness exponentially


Usage: `bash brightness.bash {up|down}`

<!--more-->

```bash
#!/usr/bin/env bash

: <<'DOC'
sudo chmod a+w /sys/class/backlight/intel_backlight/brightness

max: 2047
$ echo 2047 >> /sys/class/backlight/intel_backlight/brightness
$ echo 2048 >> /sys/class/backlight/intel_backlight/brightness
write: Invalid argument
DOC

set -Ceu

_usage() {
  local prog
  prog=$(basename "$0")
  cat <<EOS
$prog: usage:
  $prog {up|down}
EOS
}

usage() { _usage >&2; exit 1; }
usage0() { _usage; exit 0; }

# increases as (2^(1/4))^i
#
# python3 -c "[print(f'{(2**(1/4))**i:.1f}') for i in range(46)]"
# python3 -c "[print(f'{(2**(1/4))**i:.0f}') for i in range(46)]"
# 1.0 1.2 1.4 1.7 2.0 2.4 2.8 3.4 4.0 4.8 5.7 6.7 8.0 9.5 11.3 13.5 16.0 19.0 ...  1448.2 1722.2 2048.0 2435.5
# 1   1   1   2   2   2   3   3   4   5   6   7   8   10  11   13   16   19   ...  1448   1722   2048   2435
#
# 16 --up--> 19
# 16 --down--> 13
# 17 --down--> 16
# 17 --up--> 19
# 1722 --up--> 2047 (max)
# 2046 --up--> 2047 (max)
# 2047 --down--> 1722

up() {
  [ "${1+defined}" = defined ] || echo "up: BUG: NUM not given"
  NUM=$1

  [ "$NUM" = 0      ] && { echo -n 1    ; return ; }

  [ "$NUM" -le 1    ] && { echo -n 2    ; return ; }
  [ "$NUM" -le 2    ] && { echo -n 3    ; return ; }
  [ "$NUM" -le 3    ] && { echo -n 4    ; return ; }
  [ "$NUM" -le 4    ] && { echo -n 5    ; return ; }
  [ "$NUM" -le 5    ] && { echo -n 6    ; return ; }
  [ "$NUM" -le 6    ] && { echo -n 7    ; return ; }
  [ "$NUM" -le 7    ] && { echo -n 8    ; return ; }
  [ "$NUM" -le 8    ] && { echo -n 10   ; return ; }
  [ "$NUM" -le 10   ] && { echo -n 11   ; return ; }
  [ "$NUM" -le 11   ] && { echo -n 13   ; return ; }
  [ "$NUM" -le 13   ] && { echo -n 16   ; return ; }
  [ "$NUM" -le 16   ] && { echo -n 19   ; return ; }
  [ "$NUM" -le 19   ] && { echo -n 23   ; return ; }
  [ "$NUM" -le 23   ] && { echo -n 27   ; return ; }
  [ "$NUM" -le 27   ] && { echo -n 32   ; return ; }
  [ "$NUM" -le 32   ] && { echo -n 38   ; return ; }
  [ "$NUM" -le 38   ] && { echo -n 45   ; return ; }
  [ "$NUM" -le 45   ] && { echo -n 54   ; return ; }
  [ "$NUM" -le 54   ] && { echo -n 64   ; return ; }
  [ "$NUM" -le 64   ] && { echo -n 76   ; return ; }
  [ "$NUM" -le 76   ] && { echo -n 91   ; return ; }
  [ "$NUM" -le 91   ] && { echo -n 108  ; return ; }
  [ "$NUM" -le 108  ] && { echo -n 128  ; return ; }
  [ "$NUM" -le 128  ] && { echo -n 152  ; return ; }
  [ "$NUM" -le 152  ] && { echo -n 181  ; return ; }
  [ "$NUM" -le 181  ] && { echo -n 215  ; return ; }
  [ "$NUM" -le 215  ] && { echo -n 256  ; return ; }
  [ "$NUM" -le 256  ] && { echo -n 304  ; return ; }
  [ "$NUM" -le 304  ] && { echo -n 362  ; return ; }
  [ "$NUM" -le 362  ] && { echo -n 431  ; return ; }
  [ "$NUM" -le 431  ] && { echo -n 512  ; return ; }
  [ "$NUM" -le 512  ] && { echo -n 609  ; return ; }
  [ "$NUM" -le 609  ] && { echo -n 724  ; return ; }
  [ "$NUM" -le 724  ] && { echo -n 861  ; return ; }
  [ "$NUM" -le 861  ] && { echo -n 1024 ; return ; }
  [ "$NUM" -le 1024 ] && { echo -n 1218 ; return ; }
  [ "$NUM" -le 1218 ] && { echo -n 1448 ; return ; }
  [ "$NUM" -le 1448 ] && { echo -n 1722 ; return ; }
  [ "$NUM" -le 1722 ] && { echo -n 2047 ; return ; }

  [ "$NUM" -le 2047 ] && { echo -n 2047 ; return ; } # max

  echo "up: BUG: too large NUM: $NUM" ; exit 1
}

down() {
  [ "${1+defined}" = defined ] || { echo "down: BUG: NUM not given"; exit 1; }
  NUM=$1

  # 0 is truly dark, unsafe -- return 1
  [ "$NUM" = 0      ] && { echo -n 1    ; return ; }
  [ "$NUM" = 1      ] && { echo -n 1    ; return ; }

  [ "$NUM" -le 2    ] && { echo -n 1    ; return ; }
  [ "$NUM" -le 3    ] && { echo -n 2    ; return ; }
  [ "$NUM" -le 4    ] && { echo -n 3    ; return ; }
  [ "$NUM" -le 5    ] && { echo -n 4    ; return ; }
  [ "$NUM" -le 6    ] && { echo -n 5    ; return ; }
  [ "$NUM" -le 7    ] && { echo -n 6    ; return ; }
  [ "$NUM" -le 8    ] && { echo -n 7    ; return ; }
  [ "$NUM" -le 10   ] && { echo -n 8    ; return ; }
  [ "$NUM" -le 11   ] && { echo -n 10   ; return ; }
  [ "$NUM" -le 13   ] && { echo -n 11   ; return ; }
  [ "$NUM" -le 16   ] && { echo -n 13   ; return ; }
  [ "$NUM" -le 19   ] && { echo -n 16   ; return ; }
  [ "$NUM" -le 23   ] && { echo -n 19   ; return ; }
  [ "$NUM" -le 27   ] && { echo -n 23   ; return ; }
  [ "$NUM" -le 32   ] && { echo -n 27   ; return ; }
  [ "$NUM" -le 38   ] && { echo -n 32   ; return ; }
  [ "$NUM" -le 45   ] && { echo -n 38   ; return ; }
  [ "$NUM" -le 54   ] && { echo -n 45   ; return ; }
  [ "$NUM" -le 64   ] && { echo -n 54   ; return ; }
  [ "$NUM" -le 76   ] && { echo -n 64   ; return ; }
  [ "$NUM" -le 91   ] && { echo -n 76   ; return ; }
  [ "$NUM" -le 108  ] && { echo -n 91   ; return ; }
  [ "$NUM" -le 128  ] && { echo -n 108  ; return ; }
  [ "$NUM" -le 152  ] && { echo -n 128  ; return ; }
  [ "$NUM" -le 181  ] && { echo -n 152  ; return ; }
  [ "$NUM" -le 215  ] && { echo -n 181  ; return ; }
  [ "$NUM" -le 256  ] && { echo -n 215  ; return ; }
  [ "$NUM" -le 304  ] && { echo -n 256  ; return ; }
  [ "$NUM" -le 362  ] && { echo -n 304  ; return ; }
  [ "$NUM" -le 431  ] && { echo -n 362  ; return ; }
  [ "$NUM" -le 512  ] && { echo -n 431  ; return ; }
  [ "$NUM" -le 609  ] && { echo -n 512  ; return ; }
  [ "$NUM" -le 724  ] && { echo -n 609  ; return ; }
  [ "$NUM" -le 861  ] && { echo -n 724  ; return ; }
  [ "$NUM" -le 1024 ] && { echo -n 861  ; return ; }
  [ "$NUM" -le 1218 ] && { echo -n 1024 ; return ; }
  [ "$NUM" -le 1448 ] && { echo -n 1218 ; return ; }
  [ "$NUM" -le 1722 ] && { echo -n 1448 ; return ; }

  [ "$NUM" -le 2047 ] && { echo -n 1448 ; return ; }

  echo "down: BUG: too large NUM: $NUM" ; exit 1
}

[ "${1+defined}" = defined ] || usage && MODE=$1
# [ "${2+defined}" = defined ] || usage && NUM=$2  # debug
NUM=$(cat /sys/class/backlight/intel_backlight/brightness)

case $MODE in
  up)
    up "$NUM"
    up "$NUM" >> /sys/class/backlight/intel_backlight/brightness
    ;;
  down)
    down "$NUM"
    down "$NUM" >> /sys/class/backlight/intel_backlight/brightness
    ;;
  *)
    echo invalid mode: "$MODE"
    usage
    ;;
esac

exit 0

```

{{< admonition warning TODO >}}
[File permissions of sysfs are reset after reboot](https://unix.stackexchange.com/q/68897).
TODO: chown root, setuid (needs avoiding shebang)
{{< /admonition >}}



