Squeak.ru - шаблоны программирования

Меню выбора сценария Linux

Мне нужно создать меню выбора с шестью параметрами, используя цикл выбора и инструкцию case, НО НЕ КОМАНДУ ЭХО ДЛЯ ОПЦИИ МЕНЮ, и они должны отображаться следующим образом:

1) opt1
2) opt2
3) opt3
4) opt4
5) opt5
6) opt6

А не как:

1) opt1 3) opt3 5) opt5
2) opt2 4) opt4 6) opt6

Пока у меня есть этот код, но проблема с отображением, при 5 параметрах он отображается вертикально, а при 6 отображается рядом:

#! /bin/sh
PS3="Enter your choice :"
select choice in "opt1" "opt2" "opt3" "opt4" "opt5" "Exit"; do
case $REPLY in
    1) echo "$choice";;
    2) echo "$choice";;
    3) echo "$choice";;
    4) echo "$choice";;
    5) echo "$choice";;
    6) echo "see you next time";break;;
    *) echo "Wrong choice!";;
esac
done
25.05.2013

  • Здесь вы можете найти ряд решений: askubuntu.com/questions/1705/ 25.05.2013
  • в системе Ubuntu 12.04, в которой я работаю, /bin/sh — это символическая ссылка на тире, в которой даже нет команды select. при использовании bash меню выбора отображается в одном столбце. какую оболочку/дистрибутив вы используете? 25.05.2013
  • Я на Linux CentOS 6.3 и использую терминал bash 25.05.2013
  • bash и ksh имеют выбор, но да, вывод находится в одном столбце, как в моем примере ниже, даже с 6 вариантами на моем поле. Какая у вас версия Баша? 25.05.2013

Ответы:


1

Настройка переменной COLUMNS помогает ограничить количество столбцов в меню. Обычно я делаю (в сценарии):

COLUMNS=1
select ...

когда я хочу один столбец все время.

Чтобы быть точным, COLUMNS=1 означает, что ваш ТЕРМИНАЛ имеет ширину ОДИН СИМВОЛ. В этом случае у команды select нет другого выбора, кроме как распечатать ОДНУ СТОЛБЦУ пунктов меню.

Чтобы быть ДЕЙСТВИТЕЛЬНО точным, вы можете

  1. найти длину самого длинного элемента (itemLen)
  2. найдите количество предметов и мод на десять, чтобы получить максимальное количество цифр (numberLen)
  3. COLUMNS=((itemLen + numberLen = 2))

где «2» — скобка и пробел между номером пункта меню и пунктом. Но это не обязательно.

29.02.2016

2

Попробуйте что-то вроде этого:

menu()
{
    cat <<EOF
  1) opt1
  2) opt2
  3) opt3
  4) opt4
  5) opt5
  6) opt6
  q) quit
EOF

    echo -n "make your choice > <^H^H"
    read -n 1 foo
    echo

    case "$foo" in
        1|opt1) echo "opt1" ;;
        2|opt2) echo "opt2" ;;
        3|opt3) echo "opt3" ;;
        4|opt4) echo "opt4" ;;
        5|opt5) echo "opt5" ;;
        6|opt6) echo "opt6" ;;
        q|quit) echo "bye bye!" ;;
    esac
}

^H обозначают последовательность ASCII 0x08 или BS (возврат).

(В vim вы можете ввести это с помощью CTRL+v, а затем CTRL+h)

25.05.2013

3

У меня такая же проблема. Я не понял, как именно select использует LINES и COLUMNS (см. «Переменные оболочки» на справочной странице bash), но установка COLUMNS на 1 (действительно небольшое значение) помогла мне.

27.05.2014
  • Лучшее объяснение, которое я когда-либо встречал, дано Марком Г. Собеллом в его книге, здесь: books.google.com/ 15.11.2014

  • 4

    Вы можете использовать встроенную функцию select, если она доступна:

    #!/bin/bash
    
    select o in opt{1..6}; do
        case "${o}" in
            opt[1-6])
                break
                ;;
            *)
                echo "Invalid choice '${REPLY}', please pick one of the above"
                ;;
        esac
    done
    echo "You picked: ${o}"
    

    Пример запуска:

    $ ./t.sh
    1) opt1
    2) opt2
    3) opt3
    4) opt4
    5) opt5
    6) opt6
    #? 9
    Invalid choice '9', please pick one of the above
    #? asdf
    Invalid choice 'asdf', please pick one of the above
    #? 1
    You picked: opt1
    
    25.05.2013
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...