2016-12-05 60 views
0

我有一個簡單的代碼設置,但出於某種原因拒不操作應該如何爲什麼bash不接受我的顏色編碼?

#!/bin/bash 
RED='\033[0:31m' 
RESET='\033[0m' 

基本上這些都是一些簡單的顏色編碼

我接下來的事情是

for file in ./dir/*.c; do 
echo "File [${RED}$file${RESET}] has been launched" 

我的預期結果是

文件[myprogram.c]有b EEN推出(雖然名稱將是紅色)

相反,它只是拒絕編碼的顏色和轉儲

文件[\ 033 [0:31米]已經啓動

任何想法我做錯了什麼?

+0

使用'echo -e'而不是'echo',同樣使用'\ 033 [0; 31m',而不是冒號。 – ymonad

+1

請勿使用echo打印轉義序列。由於沒有便攜的方式來做到這一點。改用'printf'。 – andlrc

回答

3

首先因爲紅色是'\033[31m'。你寫的意思是別的,請看下面的內容。
然後,因爲代碼需要解釋。
這是行不通的:

$ red='\033[31m' 

$ echo "${red}Hello" 

但這:

$ red='\033[31m' 

$ echo -e "${red}Hello" 

或者,您可以指定解釋值的變量:

$ red="$(echo -e '\033[31m')" 
$ red="$(printf '\033[31m')" 

然後逃逸別t需要解釋:

$ echo "${red}Hello" 

您寫的內容(除了使用分號應該是冒號)設置了前景的「粗體」,或者用於薄/淺的0以及用於粗體/明亮的1

$ printf '\033[31mHello\033[0;31mHello\033[1;31mHello' 

此外,3x爲前景4x爲背景:

$ printf '\033[31;42mHello\033[0;44;31mHello\033[1;43;31mHello\033[0m' 

一個完整表可以被印有此:

$ printf "$(printf '%s' 033[{0,1}';'3{1..8}{';'4{1..8}mXXX,';'40m=OoO\\033[0m\\n} )" 

enter image description here

+1

你應該真的使用tput來獲取shell的顏色代碼。 – andlrc

+0

@andlrc爲什麼?我寫的代碼不在你的系統中工作嗎? – sorontar

1

隨着tput的

#!/bin/bash 
red=$(tput setaf 1) 
reset=$(tput sgr0) 
for file in ./dir/*.c; do 
echo "File [${red}$file${reset}] has been launched" 
done 

與printf的

#!/bin/bash 
RED='\033[0;31m' 
RESET='\033[0m' 
for file in ./dir/*.c; do 
printf "File [${RED}$file${RESET}] has been launched" 
done 
0

。在你的代碼中的錯字。紅色代碼是[031m。 ASCII碼始終以轉義字符開頭,即八進制33:\033。因此,要開始打印紅色文本,請加入兩個序列:\033[031m

我覺得this的帖子非常有幫助。特別是,作者建議使用tput而不是硬編碼的值,我同意他的看法。

die() { 
    local message="$1" 
    : ${message:=Aborted} 

    # See info bash BASH_SOURCE, info bash FUNCNAME, info bash BASH_LINENO 
    printf '%s at %s:%s line %d\n' \ 
     "$message" ${BASH_SOURCE[1]} ${FUNCNAME[1]} ${BASH_LINENO[0]} >&2 

    exit 1 
} 

# See man 1 tput, man 5 terminfo. 
red=$(tput setaf 1) || die 
noattr=$(tput sgr0) || die 

# If tput is unavailable (very unlikely), use the hardcoded values as follows. 
# The ANSI codes always start with the escape character (octal 33). 
#esc='\033' 
#red="${esc}[031m" 
#noattr="${esc}[0m" 

# %b causes printf to expand backslash escape sequences. See info bash printf. 
printf '%b%s%b\n%s\n' "$red" 'red text' "$noattr" 'normal text' 

注使用printf。在新軟件中使用Don't use echo

相關問題