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


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

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

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

2 ответа:

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

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

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