![通过传统颜色名称(例如红色、绿色、蓝色等)以颜色显示消息](https://linux22.com/image/203501/%E9%80%9A%E8%BF%87%E4%BC%A0%E7%BB%9F%E9%A2%9C%E8%89%B2%E5%90%8D%E7%A7%B0%EF%BC%88%E4%BE%8B%E5%A6%82%E7%BA%A2%E8%89%B2%E3%80%81%E7%BB%BF%E8%89%B2%E3%80%81%E8%93%9D%E8%89%B2%E7%AD%89%EF%BC%89%E4%BB%A5%E9%A2%9C%E8%89%B2%E6%98%BE%E7%A4%BA%E6%B6%88%E6%81%AF.png)
使用 Ubuntu 18.04 和 GNU bash 的 WSL,版本 4.4.20(1)-release (x86_64-pc)。
我希望显示一条消息传统命名的颜色通过诸如-red
、 或-green
、 或-blue
之类的参数或类似的东西(无需最终用户使用机器语法定义颜色)。
我认为即使是现代版本的printf
or也echo
无法做到这一点。
我更喜欢 shell 内置的并且不安装任何东西。
答案1
setterm 可以吗?
setterm -foreground red
答案2
您可以先将颜色词定义为变量,然后将它们与 printf 或 echo 一起使用
RED='\033[0;31m'
NONE='\033[0m' # reset colour attribues
printf "${RED}This is in red ${NONE}\n"
部分颜色代码如下:
Black 0;30 Dark Gray 1;30
Red 0;31 Light Red 1;31
Green 0;32 Light Green 1;32
Brown/Orange 0;33 Yellow 1;33
Blue 0;34 Light Blue 1;34
Purple 0;35 Light Purple 1;35
Cyan 0;36 Light Cyan 1;36
Light Gray 0;37 White 1;37
答案3
我的代码示例如下,准备睡觉,希望能说明一切:
tput_init_linux () { set_fg_color='tput setaf'; reset_color=$(tput sgr0 2>/dev/null); } # terminfo
tput_init_bsd () { set_fg_color='tput AF'; reset_color=$(tput me 2>/dev/null); } # termcap
tput_init_none () { set_fg_color=':'; reset_color=; } # the null command (:) ignores everything after it
if tput setaf 1 >/dev/null 2>&1; then tput_init_linux || tput_init_none;
elif tput AF 1 >/dev/null 2>&1; then tput_init_bsd || tput_init_none;
else tput_init_none; fi
no_color () { printf '%s' "$reset_color"; }
colorize ()
{
case "$1" in
(red) $set_fg_color 1 ;;
(green) $set_fg_color 2 ;;
(yellow) $set_fg_color 3 ;;
(blue) $set_fg_color 4 ;;
(magenta) $set_fg_color 5 ;;
(cyan) $set_fg_color 6 ;;
(white) $set_fg_color 7 ;;
(*) printf '%s\n' "[ERROR] This color ('$1') is not supported by the colorize() function. Quiting!" >&2; exit 1 ;;
esac
}
print_ok () { colorize green; printf '%s' '[OK] '; no_color; }
print_notice () { colorize cyan; printf '%s' '[NOTICE] '; no_color; }
print_debug () { colorize yellow; printf '%s' '[DEBUG] ' >&2; no_color; }
print_error () { colorize red; printf '%s' '[ERROR] ' >&2; no_color; }