Script tạo code màu sắc trên Bash console

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.

Script tạo code màu sắc trên Bash console
Script sinh mã màu sắc trên console

Đ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, cyanwhite).
  • 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!"

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.