Как выровнять справа и выровнять слева текстовые строки в Bash

Я создаю сценарий bash и хотел бы отобразить сообщение с выровненным по правому краю статусом (OK, предупреждение, ошибка и т. д.) В той же строке.

без цветов выравнивание идеально, но добавление цветов делает правый выровненный столбец обернутым к следующей строке неправильно.

#!/bin/bash

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

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

log_msg "Hello World"
exit;

2 ответов


Я не уверен, почему он обернется к следующей строке - непечатаемые последовательности (изменения цвета) должны сделать строку короче, а не длиннее. Расширение строки для компенсации работает для меня (и кстати я рекомендую использовать printf вместо echo -n для фактического сообщения):

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

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

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

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

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