I'm using tput from the ncurses package for setting colors in a terminal-aware way. You can do it with raw escape codes and most examples show it that way, but you can end up with different colors or non-functional colors on some operating systems (older macOS, among others). Using tput
should smooth that out, assuming the terminal is reporting its capabilities and behavior correctly in termcap (as I understand it).
For example, I use the following to setup colors for printing log output to the display:
readonly LOG_DEFAULT_COLOR=$(tput sgr0) # Clear colors
readonly LOG_ERROR_COLOR=$(tput setaf 1) # Red
readonly LOG_INFO_COLOR=$(tput sgr 0) # White
readonly LOG_SUCCESS_COLOR=$(tput setaf 2) # Green
readonly LOG_WARN_COLOR=$(tput setaf 3) # Yellow
readonly LOG_DEBUG_COLOR=$(tput setaf 4) # Blue
Note that the colors are somewhat arbitrary based on the palette your terminal is using. Most palettes I've seen are kinda close to right, though green often looks olive/yellowish, and others are really washed out, in the current crop of popular palettes (like Solarized). But, it does provide color. I linked the logging library I've been using in another comment, which includes POSIX-compatible examples of using colors like this (tested on recent-ish dash, bash, zsh, and ksh).
As soon as I figure out how to reliably detect Unicode in a terminal in a POSIX compatible script, I'll publish some other utility functions that use Unicode.
The resources are pretty spread out. The tput manpage is utterly opaque, to me, as it covers a bunch of stuff that isn't relevant to "make it pretty" scripting. Mostly I've just been googling a lot. Unfortunately, the vast majority of examples on the web are for bash (also bash is easier to google for), so I'm having to trial-and-error my way to a POSIX compatible implementation.
I don't know of any way to use sh directly with ncurses itself, though there are programs like whiptail and dialog that'll harness some ncurses power for your scripts. I guess they're OK, but as I mentioned in another comment, I find dialog TUIs to be clunky. I don't want a windowing style GUI that happens to work in the CLI; I want a CLI that is traditional "run a command, get some output", but the "output" part just looks nicer, and is maybe animated in some way if it makes sense (a spinner or progress bar, e.g.).