2011-12-30 50 views
6

Tôi đang tạo tập lệnh bash và muốn hiển thị thông báo có trạng thái căn chỉnh phù hợp (OK, Cảnh báo, Lỗi, v.v.) trên cùng một dòng.Cách căn chỉnh và căn trái các chuỗi văn bản căn chỉnh trong Bash

Nếu không có màu sắc, căn chỉnh hoàn hảo, nhưng việc thêm màu sẽ làm cho cột được căn chỉnh phù hợp với dòng kế tiếp, không chính xác.

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

Trả lời

6

Tôi không chắc chắn lý do tại sao nó sẽ được chuyển sang dòng tiếp theo - có chuỗi không in (thay đổi màu) sẽ làm cho dòng ngắn hơn, không dài hơn. Mở rộng dòng để bù đắp công trình đối với tôi (và BTW tôi khuyên bạn nên sử dụng printf thay vì echo -n cho thông điệp thực tế):

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

Điều này hoạt động hoàn hảo. Cảm ơn bạn đã sử dụng printf thay vì echo -n. –

+0

mẹo hay trên printf. chỉ khi tôi cần văn bản điều chỉnh bên trái :) – oligofren

3

Bạn phải chiếm thêm không gian được cung cấp bởi các màu sắc.

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" 
} 
Các vấn đề liên quan