2011-12-30 24 views
6

私はbashスクリプトを作成しており、同じ行にステータスが右揃え(OK、警告、エラーなど)のメッセージを表示したいと考えています。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

私はなぜそれが次の行に折り返さだろうかわからない - シーケンス(色の変化)を印刷されないことはもはやない、ラインを短くする必要があります持ちます。私の作品を補償するためのラインを広げる(およびところで私は、実際のメッセージのための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

これは完全に機能しました。 echo -nの代わりにprintfを使うことについてのヒントもありがとう。 –

+0

printfの良いヒント。ちょうど私が左の調整されたテキストを必要としたとき:) – oligofren

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" 
}