2011-12-30 11 views
6

में टेक्स्ट स्ट्रिंग को संरेखित करने के लिए सही तरीके से संरेखित और बाएं कैसे करें I एक बैश स्क्रिप्ट बना रहा हूं और एक ही पंक्ति पर दाएं संरेखित स्थिति (ठीक, चेतावनी, त्रुटि इत्यादि) के साथ एक संदेश प्रदर्शित करना चाहता हूं।बैश

रंगों के बिना, संरेखण सही है, लेकिन रंगों में जोड़ना सही गठबंधन कॉलम को अगली पंक्ति में गलत तरीके से लपेटता है। अमुद्रणीय दृश्यों (रंग परिवर्तन) होने लाइन छोटे, लंबे समय तक नहीं करना चाहिए -

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

उत्तर

6

मैं क्यों यह अगली पंक्ति में लपेट चाहते हैं यकीन नहीं है। मेरे लिए काम करता है क्षतिपूर्ति करने के लिए लाइन का प्रसार करना (और BTW मैं वास्तविक संदेश के लिए के बजाय 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" 
} 
+0

यह पूरी तरह से काम किया। इको-एन के बजाय printf का उपयोग करने पर टिप के लिए धन्यवाद। –

+0

printf पर अच्छी टिप। बस जब मुझे बाएं समायोजित ग्रंथों की आवश्यकता थी :) – oligofren

3

आप रंग द्वारा प्रदान की अतिरिक्त जगह के लिए खाते में करने के लिए है।

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