6

Новичок здесь. Я ищу bash-скрипт для центрирования и выравнивания текста. Мой скрипт работает только с одной строкой текста. Как бы вы улучшили это?

#!/bin/bash
COLS=$(tput cols)
while true; do
    clear
    echo -n "Type text "
    read text
    echo
    echo "Menu"
    echo "1) Right justify  "
    echo "2) Center "
    echo "3) Exit "
    echo
    echo -n "Choose [1-3]: "
    read opt
    echo
    case $opt in
        1) printf "%*s\n" $COLS "$text"
           break
        ;;
        2) printf "%*s\n" $[$COLS/2] "$text"
           break
        ;;      
        3) break
        ;;
        *)
        echo "Error. Press [1-3]"
        break
        ;;
    esac
done

2 ответа2

5

Как вы обнаружили, $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

3
#!/usr/bin/awk -f
{
  z = 92 - length
  y = int(z / 2)
  x = z - y
  printf "%*s%s%*s\n", x, "", $0, y, ""
}

вход

hello world
alpha bravo charlie delta

Выход

                                         hello world
                                  alpha bravo charlie delta

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .