printf
Çıktıyı formatlamak için kullanın (ayrıca daha taşınabilirecho
) Ayrıca renk kaçış dizilerinin gerçek değerini, onları genişletmeyi gerektiren bir biçimde depolamak yerine saklarım 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
dizeleri sağdaki boşluklarla dolduran bir uzunluk belirtimidir (uzunluk zsh
ve diğer birçok kabuğun / printf içindeki karakter sayısı fish
ve byte sayısı ) en az 15 olmalıdır.
$ 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|
Kesme ile:
$ 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|
Sütunlardaki metni biçimlendirmek için diğer yardımcı programlar POSIX'iexpand
içerir :
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(burada TAB karakterini genişletmek ( \t
) her 30 sütunda bir sekme durağı var)
Veya BSDcolumn
veya POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(burada 36 sütun genişliğinde 2 sütun üzerinde çıktı ( -w
sayfa genişliğini varsayılan değer olarak değiştirme seçeneğine bakın ).
veya BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(gibi column
tüm girişleri okuyana kadar çıkış yapmaya başlamaz).
Veya GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
: Ayrıca dize dolgu için bazı parametre genişletme bayraklar vardır ${(l:15:)hostname}
için sol dolgu ve ${(r:15:)hostname}
için doğru (kesikleri ile) dolgu. Bilgi istemi genişletme işleminde (istemlerde olduğu gibi veya bayrakla print -P
yapılan parametre genişlemelerinde etkinleştirildiği gibi %
), %F{green}
renk çıktısını da destekler , böylece şunları yapabilirsiniz:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
Veya:
print -rP "Network ${(r:15:)hostname}: $online"
İçeriği sizin kontrolünüz altında değilse (içinde olduğu gibi ) $hostname
, içeriği de derhal genişlemeye tabi tutulursa da, bu bir komut enjeksiyon güvenlik açığı oluşturur.$hostname
hostname='%<a[`reboot`]<'