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