Bash - 색상 코드를 변수에 저장

Bash - 색상 코드를 변수에 저장

컬러 텍스트를 변수에 저장하고 나중에 컬러로 인쇄하는 방법은 무엇입니까?

나는 100번의 검색에서 이 질문에 대한 답을 본 적이 없습니다. 그것은 모두 PS1 프롬프트, 인라인 printf 또는 ls --color의 데이터 사용에 관한 것입니다. 변수에 색상을 직접 추가하고 나중에 인쇄해야 합니다.

name="Hello"
name=$name"\e[36m\(Test\)\e[0m"
echo $name
printf $name

내가 얻는 결과는 다음과 같습니다.

Hello \e[36m(Test)\e0m

변수의 데이터를 기반으로 색상이 지정되지 않습니다.
나중에 인쇄하기 위해 변수에 색상 코드를 저장하는 방법 Jaeden "Sifo Dyas" al'Raec Ruiner
에게 감사드립니다.

답변1

echo -eBash에는 , printf및 의 세 가지 옵션이 있습니다 $'...'.

마지막 것이 가장 간단합니다.

$ name="Hello"; name=$name$'\033[34m(Test)\e[0m' ; echo "$name"
Hello(Test)

이 예에서는 색상 코드가 변수에 저장됩니다. 색상을 보는 것 외에 코드를 "보는" 가장 쉬운 방법은 16진수 뷰어를 사용하는 것입니다.

$ echo "$name" | od -vAn -tcx1
   H   e   l   l   o 033   [   3   5   m   (   T   e   s   t   )
  48  65  6c  6c  6f  1b  5b  33  35  6d  28  54  65  73  74  29
 033   [   0   m  \n
  1b  5b  30  6d  0a

코드를 "확인"해야 할 때(그리고 해당 코드가 작동하거나 작동하지 않는 이유) 이를 사용하십시오.

색상 코드는 var 내부에 있으며 해석됩니다. 이 방법으로 특정 색상에 대한 변수를 생성하고 사용할 수 있습니다.

$ blue=$'\033[34m'; reset=$'\033[0m'
$ echo "Hello $blue Test $reset Colors"

또 다른 접근 방식은 코드를 변수에 저장하고 "효과"가 필요할 때마다 해석하는 것입니다.

$ blue='\033[34m'; reset='\033[0m'
$ echo "Hello $blue Test $reset Colors"
Hello \033[34m Test \033[0m Colors
$ echo -e "Hello $blue Test $reset Colors"
Hello  Test  Colors

"Test"는 파란색이고 "Color"는 검정색입니다(콘솔 화면이 흰색인 경우).

이 명령 echo -e은 printf만큼 이식 가능하고 안전하지 않습니다.

$ blue='\033[34m'; reset='\033[0m'
$ printf "%s $blue%s $reset%s" "Hello" "Test" "Colors"
Hello Test Colors

전체 색상 목록(배경)은 (인쇄 공간)을 통해 표시됩니다.

 printf '\e[%sm ' {40..47} 0; echo

또는 전경색을 사용합니다.

 printf '\e[%smColor=%s  ' {30..37}{,} 0 0; echo

답변2

대신에

name="Hello"
name=$name"\e[36m\(Test\)\e[0m"
echo $name
printf $name

더 간단하게 만들 수 있어요

name="Hello"
name=$name"$(tput setaf 6)(Test)$(tput sgr0)"
echo $name
printf $name

이 접근 방식은 확장된 색상(8개 이상)에 대한 적절한 문자열을 기억하는 것보다 간단합니다. 예를 들어 다음 스크립트를 실행합니다.

#!/bin/sh
[ $# = 0 ] && exec $0 6
name="Hello"
name=$name"$(tput setaf $1)(Test)$(tput sgr0)"
echo $name
printf $name

매개변수 6, 12, 24를 사용하고 TERM다음으로 설정합니다.xterm-256color$name\E, 탈출 은 다음과 같습니다.

Hello\E[36m(Test)\E(B\E[m
Hello\E[94m(Test)\E(B\E[m
Hello\E[38;5;24m(Test)\E(B\E[m

참고로:

답변3

\e이스케이프 문자 (문자 그대로 Ctrl-[, 캐럿 [이 아님) echo -e로 구문 분석되도록 설계된 특수 이스케이프 코드입니다 . ^[편집기에서 리터럴 이스케이프를 입력하는 방법을 배우지 않고도 변수에 저장하려면 다음을 사용할 수 있습니다.

#!/bin/bash
BOLD="$( echo -e "\e[1m" )"
CYAN="$( echo -e "\e[36m" )"

echo "I am feeling ${BOLD}really ${CYAN}blue!"

답변4

printf색상이 올바르게 표시되어야 합니다.

[user@host ~]$ name="Hello"
[user@host ~]$ name=$name"\e[36m\(Test\)\e[0m"
[user@host ~]$ echo $name
Hello\e[36m\(Test\)\e[0m
[user@host ~]$ printf $name
Hello\(Test\)[user@host ~]$

마지막 줄 "Test"는 청록색이며 새 줄이 없습니다.


왜냐하면 echo다음을 추가해야 하기 때문입니다 -e.

$ help echo
[...]
Options:
      -n        do not append a newline
      -e        enable interpretation of the following backslash escapes
      -E        explicitly suppress interpretation of backslash escapes
[...]

변수에 색상을 저장하는 데 사용하십시오 echo -e.

export txtblk='\033[0;30m' # Black - Regular
export txtred='\033[0;31m' # Red
export txtgrn='\033[0;32m' # Green
export txtylw='\033[0;33m' # Yellow
export txtblu='\033[0;34m' # Blue
export txtpur='\033[0;35m' # Purple
export txtcyn='\033[0;36m' # Cyan
export txtwht='\033[0;37m' # White
export bldblk='\033[1;30m' # Black - Bold
export bldred='\033[1;31m' # Red
export bldgrn='\033[1;32m' # Green
[...]
export undblk='\033[4;30m' # Black - Underline
export undred='\033[4;31m' # Red
[...]
export bakblk='\033[40m'   # Black - Background
export bakred='\033[41m'   # Red
export badgrn='\033[42m'   # Green
export txtrst='\033[0m'    # Text Reset

[user@host ~]$ echo "$txtblu hello"
\033[0;34m hello
[user@host ~]$ echo -e "$txtblu hello"
hello # this text is blue

관련 정보