2011-12-30 23 views
6

Estoy creando una secuencia de comandos bash y me gustaría mostrar un mensaje con un estado alineado a la derecha (Aceptar, Advertencia, Error, etc.) en la misma línea.Cómo alinear a la derecha y alinear cadenas de texto a la izquierda en Bash

Sin los colores, la alineación es perfecta, pero al agregar los colores, la columna alineada a la derecha se ajusta a la siguiente línea, de forma incorrecta.

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

Respuesta

6

No estoy seguro de por qué había envolver a la siguiente línea - que tienen secuencias no imprimibles (los cambios de color) debe hacer la línea más corta, no más. La ampliación de la línea para compensar funciona para mí (y por cierto recomiendo el uso de printf en lugar de echo -n para el mensaje real):

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

Esto funcionó a la perfección. Gracias por el consejo sobre el uso de printf en lugar de echo -n también. –

+0

buen consejo en printf. justo cuando necesitaba textos ajustados :) – oligofren

3

Hay que tener en cuenta el espacio adicional proporcionada por los colores.

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