Как выровнять справа и выровнять слева текстовые строки в 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"
}