Màn hình console thật nhàm chán nếu không có màu sắc. Tuy nhiên để hiển thị được màu sắc đòi hỏi tôi phải nhớ một mớ ký tự escape lộn xộn rắc rối. Vì thế tôi làm script này để khỏi phải quan tâm đến chúng nữa.

Đoạn script sau sinh ra mã escape với những tham số đầu vào là màu chữ (foreground), màu nền (background) và kiểu chữ.
/usr/local/bin/txtfmt
#!/bin/bash
# txtfmt [-f FOREGROUND] [-b BACKGROUND] [-s STYLE] [-p]
# @author: Nguyen Hong Hai
#
BLACK=0
RED=1
GREEN=2
YELLOW=3
BLUE=4
MAGENTA=5
CYAN=6
WHITE=7
NONE=0
BOLD=1
ITALIC=3
UNDERLINE=4
SLOWBLINK=5
FASTBLINK=6
REVERSE=7
HIDE=8
STRIKETHROUGH=9
FOREGROUND=
BACKGROUND=
STYLE=
APPLY=true
usage()
{
echo "Generate bash shell color code."
echo "Usage: $(basename $0) [-f FOREGROUND] [-b BACKGROUND] [-s STYLE] [-p]"
echo
echo "Colors:"
echo " black red green yellow blue magenta cyan white"
echo " black+ red+ green+ yellow+ blue+ magenta+ cyan+ white+"
show_colors
echo
echo " HTML color code (#RRGGBB, 0xRRGGBB, RRGGBB)"
echo
echo -e "Styles:"
echo -e " \e[0mnone\e[0m \e[1mbold\e[0m \e[3mitalic\e[0m \e[4munderline\e[0m"
echo -e " \e[5mslowblink\e[0m \e[6mfastblink\e[0m \e[7mreverse\e[0m"
echo -e " hide \e[9mstrikethrough\e[0m"
}
error()
{
cat <<< "$@" 1>&2
exit 1
}
format()
{
local IFS=";"
local arg="-n"
${APPLY} && arg+="e"
[ $# -gt 0 ] && echo ${arg} "\e[${*}m" || echo ${arg} "\e[0m"
}
# generate the style code
style()
{
local s=${1^^}
if [ -n "${s}" ]; then
if [[ ${s} =~ ^(NONE|BOLD|ITALIC|UNDERLINE|SLOWBLINK|FASTBLINK|REVERSE|HIDE|STRIKETHROUGH)$ ]]; then
echo -n "${!s}"
else
error "Invalid style'${1}'"
fi
fi
}
# generate the foreground code
fgcolor()
{
local c=${1^^}
local p
if [ -n "${c}" ]; then
if [[ ${c} =~ ^(#|0X)?[0-9A-F]{6}$ ]]; then
if [ "${c:0:1}" = "#" ]; then
c=${c:1}
elif [ "${c:0:2}" = "0X" ]; then
c=${c:2}
fi
r=${c:0:2}; r=$((16#$r))
g=${c:2:2}; g=$((16#$g))
b=${c:4:2}; b=$((16#$b))
p="38;2;${r};${g};${b}"
elif [[ "${c}" =~ ^(BLACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE)\+?$ ]]; then
if [[ "${c: -1}" == "+" ]]; then
c=${c::-1}
p="9${!c}"
else
p="3${!c}"
fi
else
error "Invalid foreground color '${1}'"
fi
fi
echo -n "${p}"
}
# generate the background code
bgcolor()
{
local c=${1^^}
local p
if [ -n "${c}" ]; then
if [[ ${c} =~ ^(#|0x)?[0-9A-F]{6}$ ]]; then
if [ "${c:0:1}" = "#" ]; then
c=${c:1}
elif [ "${c:0:2}" = "0X" ]; then
c=${c:2}
fi
r=${c:0:2}; r=$((16#$r))
g=${c:2:2}; g=$((16#$g))
b=${c:4:2}; b=$((16#$b))
p="48;2;${r};${g};${b}"
elif [[ "${c}" =~ ^(BLACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE)\+?$ ]]; then
if [[ "${c: -1}" == "+" ]]; then
c=${c::-1}
p="10${!c}"
else
p="4${!c}"
fi
else
error "Invalid background color '${1}'"
fi
fi
echo -n "${p}"
}
show_colors()
{
local t
t+="\e[0m ┌──────────────────┐\n"
t+="\e[0m │ "
for ((i=0;i<8;i++)); do
t+="\e[4${i}m "
done
t+="\e[0m │\n"
t+="\e[0m │ "
for ((i=0;i<8;i++)); do
t+="\e[10${i}m "
done
t+="\e[0m │\n"
t+="\e[0m └──────────────────┘"
echo -e "${t}"
}
while getopts ":f:b:s:ph" o; do
case "${o}" in
h )
usage
exit 0
;;
f )
FOREGROUND="${OPTARG}"
;;
b )
BACKGROUND="${OPTARG}"
;;
s )
STYLE="${OPTARG}"
;;
p )
APPLY=false
;;
\? )
error "Invalid option: -${OPTARG}"
;;
: )
error "Invalid option: -${OPTARG} requires an argument"
;;
esac
done
shift $((OPTIND-1))
format $(style "${STYLE}") $(fgcolor "${FOREGROUND}") $(bgcolor "${BACKGROUND}")
Phân quyền executable cho script.
$ sudo chmod +x /usr/local/bin/txtfmt
Cách dùng
txtfmt [-f COLOR] [-b COLOR] [-s STYLE] [-p] -f: Màu chữ -b: Màu nền -s: Kiểu chữ -p: In chuỗi escape mã màu
Các màu sắc được hỗ trợ bao gồm:
- Tên 8 màu sắc cơ bản (
black,red,green,yellow,blue,magenta,cyanvàwhite). - Phiên bản sáng màu của 8 màu cơ bản (Thêm dấu
+, ví dụred+). - Mã màu HTML không bao gồm # (ví dụ màu Valentine Red là
E55451).
Các kiểu chữ được hỗ trợ bao gồm bold (in đậm), italic (in nghiêng) underline (gạch chân), slowblink (nhấp nháy chậm), fastblink (nhấp nháy nhanh), reverse (đảo foreground và background), hide (biến mất) hoặc strikethrough (gạch ngang).
Ví dụ để in một đoạn text Hello World màu vàng trên nền đỏ và có gạch chân như sau:
txtfmt -f yellow -b red -s underline && echo "Hello Vietnam" && txtfmt # disable color
Ví dụ sử dụng mã màu HTML
Black=$(txtfmt -f F7A9BB -b black -s bold -p)
Pink=$(txtfmt -f black -b F7A9BB -s bold -p)
Reset=$(txtfmt -p)
echo -e "${Black}BLACK${Pink}PINK${Reset} in your area!"








