Как вы обнаружили, $COLUMNS
полезен только в интерактивной оболочке -i
, поэтому мы используем вместо него columns="$(tput cols)"
.
Единственная проблема, с которой я столкнулся - это строка ниже. Он не центрирует текст.
printf "%*s\n" $[$COLS/2] "$text"
Расширяя вашу работу, здесь есть функция для отображения центрированного текста (из файла). Чтобы вызвать его в вашем скрипте, используйте display_center "file.txt"
display_center(){
columns="$(tput cols)"
while IFS= read -r line; do
printf "%*s\n" $(( (${#line} + columns) / 2)) "$line"
done < "$1"
}
Обратите внимание на использование ${#line}
(сродни wc -m
) для подсчета количества символов в строке. Пока вам нужно только отображать простой текст без цветов / форматирования, тогда это должно работать нормально.
Вот функция для отображения выровненного по правому краю текста (из файла), используя ту же реализацию printf.
display_right(){
columns="$(tput cols)"
while IFS= read -r line; do
printf "%*s\n" $columns "$line"
done < "$1"
}
Вы также можете делать аналогичные вещи с помощью tput и echo, но приведенный ниже пример не так надежен (т.е. потерпит неудачу с длинными строками).
row=0
col=$(( ($(tput cols) - ${#text}) / 2))
tput clear
tput cup $row $col
echo "$text"
Кроме того, вы можете рассмотреть возможность использования dialog
или select
для создания вашего меню. Это сделало бы ваш скрипт значительно чище.
http://bash.cyberciti.biz/guide/Select_loop
https://serverfault.com/questions/144939/multi-select-menu-in-bash-script