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
,cyan
và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!"