2011-12-30 13 views
6

Sto creando uno script bash e desidero visualizzare un messaggio con lo stato allineato a destra (OK, Avviso, Errore, ecc.) Sulla stessa riga.Come allineare a destra e allineare le stringhe di testo in Bash

Senza i colori, l'allineamento è perfetto, ma l'aggiunta dei colori rende la colonna giusta allineata alla riga successiva, in modo errato.

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

risposta

6

Io non so perché che sarebbe a capo alla riga successiva - viste le sequenze non stampabili (i cambiamenti di colore) dovrebbe rendere la linea più breve, non di più. Ampliando la linea per compensare opere per me (e BTW vi consiglio di usare printf invece di echo -n per il messaggio vero e proprio):

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

Questo ha funzionato perfettamente. Grazie per il suggerimento sull'utilizzo di printf invece di echo -n. –

+0

buon consiglio su printf. proprio quando avevo bisogno di testi aggiustati a sinistra :) – oligofren

3

Bisogna tenere conto per lo spazio extra fornito dai colori.

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