6

bash スクリプトを作成していて、同じ行に右揃えのステータス (OK、警告、エラーなど) のメッセージを表示したいと考えています。

色がなくても配置は完璧ですが、色を追加すると、右揃えの列が次の行に誤って折り返されます。

#!/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;
4

2 に答える 2

6

次の行に折り返される理由がわかりません。非印刷シーケンス (色の変更) を使用すると、行が長くなるのではなく、短くなるはずです。補償するために行を広げるとうまくいきます(ところでecho -n、実際のメッセージの代わりにprintfを使用することをお勧めします):

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"
}
于 2011-12-30T18:51:17.007 に答える
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"
}
于 2011-12-30T19:00:47.900 に答える