#!/bin/bash # # https://github.com/digitalnomadru/bash_colors # # Constants and functions for terminal colors. if [[ "$BASH_SOURCE" == "$0" ]]; then is_script=true set -eu -o pipefail else is_script=false fi CLR_ESC="\033[" # All these variables has a function with the same name, but in lower case. # CLR_RESET=0 # reset all attributes to their defaults CLR_RESET_UNDERLINE=24 # underline off CLR_RESET_REVERSE=27 # reverse off CLR_DEFAULT=39 # set underscore off, set default foreground color CLR_DEFAULTB=49 # set default background color CLR_BOLD=1 # set bold CLR_BRIGHT=2 # set half-bright (simulated with color on a color display) CLR_UNDERSCORE=4 # set underscore (simulated with color on a color display) CLR_REVERSE=7 # set reverse video CLR_BLACK=30 # set black foreground CLR_RED=31 # set red foreground CLR_GREEN=32 # set green foreground CLR_BROWN=33 # set brown foreground CLR_BLUE=34 # set blue foreground CLR_MAGENTA=35 # set magenta foreground CLR_CYAN=36 # set cyan foreground CLR_WHITE=37 # set white foreground CLR_BLACKB=40 # set black background CLR_REDB=41 # set red background CLR_GREENB=42 # set green background CLR_BROWNB=43 # set brown background CLR_BLUEB=44 # set blue background CLR_MAGENTAB=45 # set magenta background CLR_CYANB=46 # set cyan background CLR_WHITEB=47 # set white background # check if string exists as function # usage: if fn_exists "sometext"; then ... fi function fn_exists { type -t "$1" | grep -q 'function' } # iterate through command arguments, o allow for iterative color application function clr_layer { # default echo setting CLR_ECHOSWITCHES="-e" CLR_STACK="" CLR_SWITCHES="" ARGS=("$@") # iterate over arguments in reverse for ((i=$#-1; i>=0; i--)); do ARG=${ARGS[$i]} # echo $ARG # set CLR_VAR as last argtype firstletter=${ARG:0:1} # check if argument is a switch if [ "$firstletter" = "-" ] ; then # if -n is passed, set switch for echo in clr_escape if [[ $ARG == *"n"* ]]; then CLR_ECHOSWITCHES="-en" CLR_SWITCHES=$ARG fi else # last arg is the incoming string if [ -z "$CLR_STACK" ]; then CLR_STACK=$ARG else # if the argument is function, apply it if [ -n "$ARG" ] && fn_exists $ARG; then #continue to pass switches through recursion CLR_STACK=$($ARG "$CLR_STACK" $CLR_SWITCHES) fi fi fi done # pass stack and color var to escape function clr_escape "$CLR_STACK" $1; } # General function to wrap string with escape sequence(s). # Ex: clr_escape foobar $CLR_RED $CLR_BOLD function clr_escape { local result="$1" until [ -z "${2:-}" ]; do if ! [ $2 -ge 0 -a $2 -le 47 ] 2>/dev/null; then echo "clr_escape: argument \"$2\" is out of range" >&2 && return 1 fi result="${CLR_ESC}${2}m${result}${CLR_ESC}${CLR_RESET}m" shift || break done echo "$CLR_ECHOSWITCHES" "$result" } function clr_reset { clr_layer $CLR_RESET "$@"; } function clr_reset_underline { clr_layer $CLR_RESET_UNDERLINE "$@"; } function clr_reset_reverse { clr_layer $CLR_RESET_REVERSE "$@"; } function clr_default { clr_layer $CLR_DEFAULT "$@"; } function clr_defaultb { clr_layer $CLR_DEFAULTB "$@"; } function clr_bold { clr_layer $CLR_BOLD "$@"; } function clr_bright { clr_layer $CLR_BRIGHT "$@"; } function clr_underscore { clr_layer $CLR_UNDERSCORE "$@"; } function clr_reverse { clr_layer $CLR_REVERSE "$@"; } function clr_black { clr_layer $CLR_BLACK "$@"; } function clr_red { clr_layer $CLR_RED "$@"; } function clr_green { clr_layer $CLR_GREEN "$@"; } function clr_brown { clr_layer $CLR_BROWN "$@"; } function clr_blue { clr_layer $CLR_BLUE "$@"; } function clr_magenta { clr_layer $CLR_MAGENTA "$@"; } function clr_cyan { clr_layer $CLR_CYAN "$@"; } function clr_white { clr_layer $CLR_WHITE "$@"; } function clr_blackb { clr_layer $CLR_BLACKB "$@"; } function clr_redb { clr_layer $CLR_REDB "$@"; } function clr_greenb { clr_layer $CLR_GREENB "$@"; } function clr_brownb { clr_layer $CLR_BROWNB "$@"; } function clr_blueb { clr_layer $CLR_BLUEB "$@"; } function clr_magentab { clr_layer $CLR_MAGENTAB "$@"; } function clr_cyanb { clr_layer $CLR_CYANB "$@"; } function clr_whiteb { clr_layer $CLR_WHITEB "$@"; } # Outputs colors table function clr_dump { local T='gYw' echo -e "\n 40m 41m 42m 43m 44m 45m 46m 47m"; for FGs in ' 0m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' \ ' 32m' '1;32m' ' 33m' '1;33m' ' 34m' '1;34m' \ ' 35m' '1;35m' ' 36m' '1;36m' ' 37m' '1;37m'; do FG=${FGs// /} echo -en " $FGs \033[$FG $T " for BG in 40m 41m 42m 43m 44m 45m 46m 47m; do echo -en " \033[$FG\033[$BG $T \033[0m"; done echo; done echo clr_bold " Code Function Variable" echo \ ' 0 clr_reset $CLR_RESET 1 clr_bold $CLR_BOLD 2 clr_bright $CLR_BRIGHT 4 clr_underscore $CLR_UNDERSCORE 7 clr_reverse $CLR_REVERSE 30 clr_black $CLR_BLACK 31 clr_red $CLR_RED 32 clr_green $CLR_GREEN 33 clr_brown $CLR_BROWN 34 clr_blue $CLR_BLUE 35 clr_magenta $CLR_MAGENTA 36 clr_cyan $CLR_CYAN 37 clr_white $CLR_WHITE 40 clr_blackb $CLR_BLACKB 41 clr_redb $CLR_REDB 42 clr_greenb $CLR_GREENB 43 clr_brownb $CLR_BROWNB 44 clr_blueb $CLR_BLUEB 45 clr_magentab $CLR_MAGENTAB 46 clr_cyanb $CLR_CYANB 47 clr_whiteb $CLR_WHITEB ' } if [[ "$is_script" == "true" ]]; then clr_dump fi