ใช้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
และไบต์ใน shells / 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
(ที่นี่ขยายอักขระ TAB ( \t
) พร้อมกับแท็บหยุดทุก ๆ 30 คอลัมน์)
หรือBSDcolumn
หรือPOSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(ที่นี่จะแสดงผลในคอลัมน์กว้าง 36 36 คอลัมน์ 2 ตัว (ดู-w
ตัวเลือกเพื่อเปลี่ยนความกว้างของหน้าจากค่าเริ่มต้น 72)
หรือBSDrs
:
{
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`]<'
)