Gunakan printf
untuk memformat output (ini juga lebih portabel daripadaecho
). Saya juga akan menyimpan nilai nyata dari urutan pelarian warna daripada menyimpannya dalam bentuk yang membutuhkan ekspansi 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
adalah spesifikasi format yang melapisi string dengan spasi di sebelah kanan sehingga panjangnya (dalam jumlah karakter dalam zsh
dan fish
dan byte di sebagian besar cangkang / printf lain ) setidaknya 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|
Dengan pemotongan:
$ 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|
Utilitas lain untuk memformat teks dalam kolom termasuk POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(di sini perluas karakter TAB ( \t
) dengan tab berhenti setiap 30 kolom)
Atau BSDcolumn
atau POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(di sini menghasilkan 2 kolom lebar 36-kolom (lihat -w
opsi untuk mengubah lebar halaman dari default 72)).
atau BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(Seperti column
tidak akan mulai menghasilkan sampai telah membaca semua input).
Atau GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
juga memiliki beberapa flag ekspansi parameter untuk string padding: ${(l:15:)hostname}
untuk bantalan kiri dan ${(r:15:)hostname}
untuk bantalan kanan (dengan pemotongan). Dalam ekspansi yang cepat (seperti pada prompt atau dalam print -P
atau seperti yang diaktifkan dalam ekspansi parameter dengan %
flag), itu juga mendukung %F{green}
output warna, sehingga Anda dapat melakukan:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Atau:
print -rP "Network ${(r:15:)hostname}: $online"
Meskipun konten $hostname
kemudian juga akan tunduk pada ekspansi yang cepat, yang akan merupakan kerentanan perintah injeksi jika konten $hostname
tidak di bawah kendali Anda (seperti di hostname='%<a[`reboot`]<'
)