Как выравнивать текст по правому краю и выравнивать по левому краю в Bash - PullRequest
6 голосов
/ 30 декабря 2011

Я создаю сценарий 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;

Ответы [ 2 ]

6 голосов
/ 30 декабря 2011

Я не уверен, почему это перенесено на следующую строку - непечатные последовательности (изменения цвета) должны сделать строку короче, а не длиннее. Расширение линии для компенсации работает для меня (и кстати, я рекомендую использовать 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"
}
3 голосов
/ 30 декабря 2011

Вы должны учитывать дополнительное пространство, предоставленное цветами.

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