Bash – Как сделать каждый выбор меню в 1 строке вместо нескольких выборов в 1 строке

Im, создающий скрипт для моей темы, имеет 6 вариантов: 1) Проверьте обновление темы 2) Переустановите тему 3) Установите шрифт 4) Установите обои 5) Проверьте обновление инструмента 6) Закройте

Вот код

clear echo "===========================" echo "Tool for theme" echo "===========================" function check_update { echo "checking theme update" } function reinstall_theme { echo "Reinstalling" echo "===========================" } function font { echo "Installing font" } function wall { echo "Installing wallpaper" } function check_update_tool { echo "Checking tool update" } all_done=0 while (( !all_done )); do options=("Check theme update" "Reinstall theme" "Install font" "Install wallpaper" "Check tool update" "Quit") echo "Choose an option: " select opt in "${options[@]}"; do case $REPLY in 1) check_update; break ;; 2) reinstall_theme; break ;; 3) font; break ;; 4) wall; break ;; 5) check_update_tool; break ;; 6) all_done=1; break ;; *) echo "Invalid option" ;; esac done done echo "Exiting" sleep 2 

Но когда я запускаю его, выбор меню беспорядок

 ================== Tool for theme ================== Choose an option: 1) Check theme update 2) Reinstall theme 3) Install font 4) Install Wallpaper 5) Check tool update 6) Quit 

Но я хочу, чтобы

 =============== Tool for theme =============== Choose an option: 1) Check theme update 2) Reinstall theme 3) Install font 4) Install wallpaper 5) Check tool update 6) Quit 

Итак, как я могу исправить меню?

Вы можете установить COLUMNS для ограничения ширины экрана, например, если вы установите ее на 12, она отформатирует ваш пример в один столбец:

 COLUMNS=12 select opt in "${options[@]}"; do case $REPLY in 1) check_update; break ;; 2) reinstall_theme; break ;; 3) font; break ;; 4) wall; break ;; 5) check_update_tool; break ;; 6) all_done=1; break ;; *) echo "Invalid option" ;; esac 

производит

 =========================== Tool for theme =========================== Choose an option: 1) Check theme update 2) Reinstall theme 3) Install font 4) Install wallpaper 5) Check tool update 6) Quit #? 

Руководство bash описывает COLUMNS:

Используется командой select для определения ширины терминала при печати списков выбора. Автоматически устанавливается, если checkwinsize опция checkwinsize (см. «Shopt Builtin» ) или в интерактивной оболочке после получения SIGWINCH .

Помимо просмотра этой функции на странице руководства, она помогает прочитать исходный код, чтобы получить полную историю. Эта переменная используется в функции select_query , с комментарием

 / * Распечатайте элементы LIST, по одному на строку, которому предшествует индекс от 1 до
    LIST_LEN.  Затем отобразите PROMPT и дождитесь, пока пользователь вводит номер.
    Если число от 1 до LIST_LEN, верните этот выбор.  Если EOF
    читается, возвращает пустую строку.  Если пустая строка введена или недействительна
    номер вводится, цикл выполняется снова.  * /

и позже, в функции select_query

   t = get_string_value ("COLUMNS");
   COLS = (t && * t)?  atoi (t): 80;

Если вы даете разумную величину, atoi дает разумные результаты (даже нулевое значение в этом случае было бы правдоподобным, так как это меньше 80 столбцов и будет возвращено atoi если вы установите COLUMNS на нечетное значение). Если нет значения (т.е. COLUMNS="" ), bash использует 80 столбцов.

Дальнейшее чтение:

  • atoi – преобразовать строку в целое число

    Вызов atoi (str) должен быть эквивалентен:
    (int) strtol(str, (char **)NULL, 10)

  • strtol, strtoll – преобразование строки в длинное целое число

    Если никакое преобразование не может быть выполнено, возвращается 0