printf
प्रारूप आउटपुट का उपयोग करें (यह भी अधिक पोर्टेबल हैecho
)। मैं रंग से बचने के दृश्यों के वास्तविक मूल्य को भी उन्हें एक ऐसे रूप में संग्रहीत करने के बजाय संग्रहित करूंगा, जिसके विस्तार की आवश्यकता है 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
एक प्रारूप विनिर्देश पैड लंबाई के रूप में पर ठीक है तो रिक्त स्थान के साथ तार (में वर्णों की संख्या में है कि है zsh
और fish
और अधिकांश अन्य गोले / printf में बाइट्स ) कम से कम 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|
छंटनी के साथ:
$ 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|
कॉलम में पाठ को प्रारूपित करने के लिए अन्य उपयोगिताओं में POSIXexpand
शामिल हैं :
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(यहाँ टैब वर्ण का विस्तार \t
) टैब के साथ हर 30 कॉलम को रोकता है)
या BSDcolumn
या POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(यहां 2 36-कॉलम चौड़े कॉलम पर आउटपुट करना ( -w
पृष्ठ चौड़ाई को 72 के डिफ़ॉल्ट से बदलने का विकल्प देखें )।
या बीएसडीrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(जैसे column
कि यह सभी इनपुट को पढ़ने तक आउटपुट शुरू नहीं करेगा)।
या GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
: भी स्ट्रिंग गद्दी के लिए कुछ पैरामीटर विस्तार झंडे है ${(l:15:)hostname}
के लिए छोड़ दिया गद्दी और ${(r:15:)hostname}
के लिए सही गद्दी (काट-छांट के साथ)। में शीघ्र विस्तार (संकेतों में या में की तरह print -P
के रूप में या के साथ पैरामीटर विस्तार में सक्षम %
झंडा), यह भी समर्थन करता है, %F{green}
रंग उत्पादन के लिए है, तो आप कर सकते हैं:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
या:
print -rP "Network ${(r:15:)hostname}: $online"
हालाँकि तब की सामग्री $hostname
भी त्वरित विस्तार के अधीन होगी, जो एक कमांड इंजेक्शन भेद्यता का गठन करेगी यदि सामग्री $hostname
आपके नियंत्रण में नहीं थी (जैसे hostname='%<a[`reboot`]<'
)