2016-03-02 58 views
4

我希望看到有人能指出我做錯了什麼,因爲我很難過。我正在嘗試學習bash腳本來部署開發測試服務器。我試圖實現的一件事情是在腳本的一部分完成或操作完成時輸出狀態輸出。作爲一個例子:Bash腳本printf顏色來自變量?

printf "[ %s ] %s distribution detected. Validated as supported by this script.\n" "$PASSED" "$LINUX_DISTRO" 

我有被格式化第一串,%s,這是$PASSED的值的問題。在腳本的開頭我已經定義$PASSED

PASSED="\e[32mPASSED\e[0m" 

然而,當我去執行腳本,輸出如下所示:

[ \e[32mPASSED\e[0m ] CENTOS distribution detected. Validated as supported by this script. 

不是正確的輸出,它看起來像的:

[ PASSED ] CENTOS distribution detected. Validated as supported by this script. 

其中「通過」用綠色書寫。

但是,我也注意到,如果我做到以下幾點:

printf "[ $PASSED ] %s distribution detected. Validated as supported by this script.\n" "$LINUX_DISTRO" 

上述行爲正確,但我相信是沒有這樣做的正確方法。有任何想法嗎?

+0

不要硬編碼終端在字符串中轉義,直到您知道您要寫入的終端類型爲止。並非所有的世界都是VT100!我建議你使用'tput'或類似的 - 這就是它的用途。 –

+0

@TobySpeight我會看看'tput'。乾杯 –

回答

1

你想讓bash解釋反斜槓字符。在printf中使用%b而不是%s。所以相反,你應該有以下幾點。

printf "[ %b ] %s distribution detected. Validated as supported by this script.\n" $PASSED $LINUX_DISTRO 

另外,我修改了你的變量。

PASSED="\e[00;32mPASSED\e[0m" 
+0

謝謝!我不知道'%b',這解決了這個問題。 –

1

另一個(非標準)的解決方案是直接放轉義字符中的原始字符串,而不是爲\eprintf解釋。

PASSED=$'\e[32mPASSED\e[0m' 
printf '[ %s ] some test\n' "$PASSED" 

然而,這種假設你的腳本由/bin/bash運行,而不是/bin/sh(這可能bash,但在POSIX兼容模式下運行)。

使用%b具有相同的問題:它特定於bash,並且您可能不希望bash是執行腳本的shell。

完全符合POSIX標準的解決方案是使用printf本身來創建值PASSED

# \e not supported by POSIX; use \033 (octal) instead. 
PASSED=$(printf '\033[32mPASSED\033[0m') 
printf '[ %s ] some test\n' "$PASSED"