Bash

tput setaf 顏色表?如何確定顏色程式碼?

  • January 24, 2022

我正在為我的終端著色PS1

我正在使用tput;設置顏色變數 例如,這裡是紫色的:

PURPLE=$(tput setaf 125)

問題:

如何找到125其他顏色的顏色程式碼(例如 )?

某處是否有顏色表指南/備忘單?

我只是不確定是什麼125……有什麼方法可以將十六進制顏色轉換為setaf可以使用的數字嗎?

tput 可用的顏色計數由 給出tput colors

要查看基本的 8 種顏色(setf在 urxvt 終端和setafxterm 終端中使用):

$ printf '\e[%sm▒' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background

通常這樣命名:

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

要查看擴展的 256 種顏色(setaf在 urxvt 中使用):

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'

如果你想要數字和有序的輸出:

#!/bin/bash
color(){
   for c; do
       printf '\e[48;5;%dm%03d' $c $c
   done
   printf '\e[0m \n'
}

IFS=$' \t\n'
color {0..15}
for ((i=0;i<6;i++)); do
   color $(seq $((i*36+16)) $((i*36+51)))
done
color {232..255}

256色圖按順序排列,標有索引


1600 萬種顏色需要相當多的程式碼(有些控制台無法顯示這一點)。

基本情況是:

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fbfront/back3/4

一個簡單的測試你的控制台顯示這麼多顏色的能力是:

for r in {200..255..5}; do fb=4;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

紅線,從深到淺(從左到右) 它將呈現一條紅線,從左到右的色調變化非常小。如果這個微小的變化是可見的,那麼您的控制台就可以顯示 1600 萬種顏色。

對於 RGB(紅、綠、藍),每個rgb都是 0 到 255 之間的值。

如果您的控制台類型支持此功能,則此程式碼將創建一個顏色表:

mode2header(){
   #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
   printf '\e[mR\n' # reset the colors.
   printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
   printf '\e[m%59s\n'   "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
}
mode2colors(){
   # foreground or background (only 3 or 4 are accepted)
   local fb="$1"
   [[ $fb != 3 ]] && fb=4
   local samples=(0 63 127 191 255)
   for         r in "${samples[@]}"; do
       for     g in "${samples[@]}"; do
           for b in "${samples[@]}"; do
               printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
           done; printf '\e[m\n'
       done; printf '\e[m'
   done; printf '\e[mReset\n'
}
mode2header
mode2colors 3
mode2colors 4

以索引為標籤的範例前景色圖表

以索引為標籤的範例背景顏色圖表

要將十六進制顏色值轉換為(最近的)0-255 顏色索引:

fromhex(){
   hex=${1#"#"}
   r=$(printf '0x%0.2s' "$hex")
   g=$(printf '0x%0.2s' ${hex#??})
   b=$(printf '0x%0.2s' ${hex#????})
   printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                      (g<75?0:(g-35)/40)*6   +
                      (b<75?0:(b-35)/40)     + 16 ))"
}

將其用作:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

要查找HTML 顏色格式中使用的顏色編號:

#!/bin/dash
tohex(){
   dec=$(($1%256))   ### input must be a number in range 0-255.
   if [ "$dec" -lt "16" ]; then
       bas=$(( dec%16 ))
       mul=128
       [ "$bas" -eq "7" ] && mul=192
       [ "$bas" -eq "8" ] && bas=7
       [ "$bas" -gt "8" ] && mul=255
       a="$((  (bas&1)    *mul ))"
       b="$(( ((bas&2)>>1)*mul ))" 
       c="$(( ((bas&4)>>2)*mul ))"
       printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
   elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
       b=$(( (dec-16)%6  )); b=$(( b==0?0: b*40 + 55 ))
       g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
       r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
       printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
   else
       gray=$(( (dec-232)*10+8 ))
       printf 'dec= %3s  gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
   fi
}

for i in $(seq 0 255); do
   tohex ${i}
done

將其用作(“基本”是前 16 種顏色,“顏色”是主要組,“灰色”是最後一個灰色):

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626

引用自:https://unix.stackexchange.com/questions/269077