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`]<')