2011-12-30 61 views
6

我正在創建bash腳本並希望在同一行上顯示帶有右對齊狀態(OK,Warning,Error等)的消息。如何在Bash中右對齊並左對齊文本字符串

如果沒有顏色,對齊是完美的,但添加顏色會使右對齊列錯誤地繞到下一行。

#!/bin/bash 

log_msg() { 
    RED=$(tput setaf 1) 
    GREEN=$(tput setaf 2) 
    NORMAL=$(tput sgr0) 
    MSG="$1" 
    let COL=$(tput cols)-${#MSG} 

    echo -n $MSG 
    printf "%${COL}s" "$GREEN[OK]$NORMAL" 
} 

log_msg "Hello World" 
exit; 

回答

6

我不確定它爲什麼會換行到下一行 - 非打印序列(顏色變化)應該使行更短,而不是更長。拓寬線爲我補償工程(和BTW,我建議用printf代替echo -n實際郵件):

log_msg() { 
    RED=$(tput setaf 1) 
    GREEN=$(tput setaf 2) 
    NORMAL=$(tput sgr0) 
    MSG="$1" 
    let COL=$(tput cols)-${#MSG}+${#GREEN}+${#NORMAL} 

    printf "%s%${COL}s" "$MSG" "$GREEN[OK]$NORMAL" 
} 
+0

這工作完美。感謝您使用printf而不是echo -n的提示。 – 2011-12-30 19:11:38

+0

關於printf的好提示。只是當我需要左調整文本:) – oligofren 2012-06-15 12:33:14

3

你必須考慮通過顏色提供的額外空間。

log_msg() { 
    RED=$(tput setaf 1) 
    GREEN=$(tput setaf 2) 
    NORMAL=$(tput sgr0) 
    MSG="$1" 
    STATUS="[OK]" 
    STATUSCOLOR="$GREEN${STATUS}$NORMAL" 
    let COL=$(tput cols)-${#MSG}+${#STATUSCOLOR}-${#STATUS} 

    echo -n $MSG 
    printf "%${COL}s\n" "$STATUSCOLOR" 
}