Sử dụng printf
để định dạng đầu ra (nó cũng dễ mang theo hơnecho
). Tôi cũng sẽ lưu trữ giá trị thực của các chuỗi thoát màu thay vì lưu trữ chúng ở dạng yêu cầu mở rộng bằng echo
.
RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0)
online="${GREEN}online$NC" offline="${RED}offline$NC"
ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"
%-15s
là một đặc điểm kỹ thuật định dạng mà miếng đệm các dây với không gian bên phải như vậy là chiều dài (trong số ký tự trong zsh
và fish
và byte trong hầu hết các tiện ích khác / printf ) phải có ít nhất 15.
$ printf '|%-4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcde|
printf '|%4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcde|
Với sự cắt ngắn:
$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcd|
Các tiện ích khác để định dạng văn bản trong các cột bao gồm POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(ở đây mở rộng ký tự TAB ( \t
) với tab dừng sau mỗi 30 cột)
Hoặc BSDcolumn
hoặc POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(ở đây xuất ra 2 cột rộng 36 cột (xem -w
tùy chọn thay đổi độ rộng trang từ mặc định là 72)).
hoặc BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(giống như column
sẽ không bắt đầu xuất cho đến khi nó đã đọc tất cả các đầu vào).
Hoặc GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
cũng có một số cờ mở rộng tham số cho chuỗi padding: ${(l:15:)hostname}
cho trái padding và ${(r:15:)hostname}
cho đúng đệm (với cắt ngắn). Trong mở rộng nhanh chóng (như trong lời nhắc hoặc trong print -P
hoặc như được bật trong mở rộng tham số với %
cờ), nó cũng hỗ trợ %F{green}
cho đầu ra màu, vì vậy bạn có thể làm:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Hoặc là:
print -rP "Network ${(r:15:)hostname}: $online"
Mặc dù nội dung $hostname
sau đó cũng sẽ bị mở rộng nhanh chóng, điều này sẽ tạo thành lỗ hổng tiêm lệnh nếu nội dung $hostname
không nằm trong tầm kiểm soát của bạn (như trong hostname='%<a[`reboot`]<'
)