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`]<'
)
column
(perintah BSD, juga porting ke Linux dan ditemukan secara default pada beberapa distribusi, jangan bingung dengan GNUcolumns
) perlu membaca seluruh input sebelum dapat mulai mengeluarkan sesuatu karena perlu menghitung lebar kolom berdasarkan pada yang terluas.Perbarui skrip Anda untuk memasukkan nomor yang diatur ke
\t
(tab) tempat Anda ingin menabrak kolom.Keluarkan sesuatu yang serupa dengan yang berikut ini akan memberi Anda perataan yang diperlukan:
sumber
printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123
tidak sejajar dengan benar. Anda dapat mengatasinya dengan menggunakanexpand
untuk memperluas tab dengan penghentian tab yang berbeda seperti yang ditunjukkan dalam jawaban saya.Untuk menampilkan lebih baik daripada @Roman
Kemudian tambahkan
\t
di setiap baris untuk membaginya menjadi kolom.sumber