컬러 텍스트를 변수에 저장하고 나중에 컬러로 인쇄하는 방법은 무엇입니까?
나는 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 -e
Bash에는 , 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