Seperti yang telah Anda temukan, $COLUMNS
hanya berguna secara interaktif -i
shell, jadi kami gunakan columns="$(tput cols)"
sebagai gantinya.
Satu-satunya masalah yang saya miliki adalah dengan baris di bawah ini. Tidak memusatkan teks.
printf "%*s\n" $[$COLS/2] "$text"
Memperluas pekerjaan Anda, berikut adalah fungsi untuk menampilkan teks terpusat (dari dari file). Untuk menyebutnya dalam skrip Anda, gunakan display_center "file.txt"
display_center(){
columns="$(tput cols)"
while IFS= read -r line; do
printf "%*s\n" $(( (${#line} + columns) / 2)) "$line"
done < "$1"
}
Perhatikan penggunaan ${#line}
(mirip dengan wc -m
) untuk menghitung jumlah karakter dalam baris. Selama Anda hanya perlu menampilkan teks biasa tanpa warna / format, maka ini akan berfungsi dengan baik.
Berikut adalah fungsi untuk menampilkan teks yang dibenarkan benar (dari file) menggunakan implementasi printf Anda yang sama.
display_right(){
columns="$(tput cols)"
while IFS= read -r line; do
printf "%*s\n" $columns "$line"
done < "$1"
}
Anda juga dapat melakukan hal serupa dengan tput dan gema, tetapi contoh di bawah ini tidak begitu kuat (mis. Akan gagal dengan string panjang).
row=0
col=$(( ($(tput cols) - ${#text}) / 2))
tput clear
tput cup $row $col
echo "$text"
Juga, Anda mungkin ingin mempertimbangkan untuk menggunakan dialog
atau select
untuk menghasilkan menu Anda. Itu akan membuat skrip Anda lebih bersih.
http://bash.cyberciti.biz/guide/Select_loop
https://serverfault.com/questions/144939/multi-select-menu-in-bash-script
awk '{ z = '$(tput cols)' - length; y = int(z / 2); x = z - y; printf "%*s%s%*s\n", x, "", $0, y, ""; }'