2011-12-30 4 views
6

Je crée un script bash et je souhaite afficher un message avec un état aligné à droite (OK, Avertissement, Erreur, etc.) sur la même ligne.Comment aligner à droite et aligner à gauche les chaînes de texte dans Bash

Sans les couleurs, l'alignement est parfait, mais en ajoutant les couleurs, la colonne alignée à droite ne passe pas correctement à la ligne suivante.

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

Répondre

6

Je ne sais pas pourquoi il avait wrap à la ligne suivante - ayant des séquences non imprimables (les changements de couleur) devrait rendre la ligne plus courte, ne plus. L'élargissement de la ligne pour compenser des œuvres pour moi (et BTW je recommande d'utiliser printf au lieu de echo -n pour le message réel):

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

Cela a fonctionné parfaitement. Merci pour le conseil sur l'utilisation de printf au lieu de echo -n aussi. –

+0

bonne astuce sur printf. juste quand j'avais besoin de textes ajustés à gauche :) – oligofren

3

Vous devez tenir compte de l'espace supplémentaire fourni par les couleurs.

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