bash скрипт меню выбора
Как я могу создать меню выбора в сценарии оболочки?
Я создаю простой скрипт bash и хочу создать в нем меню выбора, например:
И по выбору пользователя я хочу, чтобы выполнялись разные действия. Я noob, пишущий для bash, я искал ответы в Интернете, но ничего конкретного не получил.
Добавляйте break операторы везде, где вам нужен select цикл для выхода. Если a break не выполняется, select оператор зацикливается, и меню отображается повторно.
В третий вариант я включил переменные, которые устанавливаются select оператором, чтобы продемонстрировать, что у вас есть доступ к этим значениям. Если вы выберете его, он выведет:
Обратите внимание, что варианты выбора могут быть простым списком непосредственно в select выражении, например так:
но вы не можете поместить такой список в скалярную переменную из-за пробелов в одном из вариантов.
Вы также можете использовать глобирование файлов, если вы выбираете среди файлов:
Оба будут зациклены, пока пользователь явно не выберет Выход (или Отмена для zenity). Это хороший подход для интерактивных меню сценариев: после выбора и выполнения действия снова открывается меню для другого выбора. Если выбор должен быть одноразовым, используйте только break после esac (подход zenity может быть дополнительно сокращен)
Оба case основаны на индексе, а не на стоимости. Я думаю, что это легче кодировать и поддерживать
Массив также используется для zenity подхода.
Опция «Выйти» не входит в число первоначальных, оригинальных опций. Он добавляется при необходимости, поэтому ваш массив остается чистым. В конце концов, «Выход» не нужен для zenity, пользователь может просто нажать «Отмена» (или закрыть окно), чтобы выйти. Обратите внимание, как оба используют один и тот же нетронутый массив параметров.
PS3 и REPLY vars не может быть переименован. select жестко запрограммирован, чтобы использовать их. Все остальные переменные в скрипте (opt, options, prompt, title) могут иметь любые имена, которые вы хотите, при условии, что вы делаете корректировки
Написание скрипта простого консольного Bash меню
Код рабочего скрипта представлен ниже, после блока кода приведено описание работы
Bash меню проучилось интерактивным, программа выполняется тем или иным образом в зависимости от вводимой пользователем информации.
Скрипт начинается с указания командного интерпретатора
Определяем значение переменной и начинаем цикл while, выход из цикла будет происходить в случае если значение переменной будет отлично от нуля.
Пока x = 0 выводим при помощи echo строку «Do u like to code (Y/N). Hit q to quit»
Далее даем команду на считывание ответа и используя оператор case выводим различные результаты при разных ответах (предварительно очищаем экран clear)
do
clear
read answer
Если ответ Y — выводим «It’s great, of course u love it, especially in bash»
case «$answer» in
Y)
echo «It’s great, of course I love it, especially in bash»
x=1
;;
Приравниваем x=1 и выходим из цикла, ;; означает окончание каждого из возможных вариантов в case
Тем же образом выводим заданное предложение в случае ответа N
N)
echo «U said NO. It’s definetly is not true…Think it over again»
x=1
;;
При нажатии на q будет осуществляться выходи из программы с выводом «This is the end», которому будет предшествовать отсчет от 5 до 0 с интервалом в 1 секунду. Цифры при обратном отсчете выводятся посредством утилиты figlet.
При нажатии любой другой клавиши в момент считывания ответа будет выоплняться условие определяемое при помощи *). Выводим «Not an option» и через 3 секунды задаем вопрос снова.
*)
clear
echo «Not an option»
sleep 3
Оператор case завершается вводом esac. За счет done завершается do
esac
done
Посмотрите другой пример использования оператора case в bash.
Как я могу создать меню выбора в сценарии оболочки?
Вы можете создать общий репозиторий Git на частном сервере с доступом SSH. Например, для этого я использую для этого учетную запись nearfreespeech.net, а стоимость очень низкая.
Если вы хотите получить фантазию, вы можете создать скрипт cron для автоматического нажатия / вытаскивания изменений так часто, всегда сохраняя свои файлы в актуальном состоянии. Пока вы не работаете на двух машинах одновременно, вы никогда не должны сталкиваться с конфликтами слияния.
11 ответов
Добавить операторы break везде, где нужно, чтобы цикл выбора select завершился. Если break не выполняется, то цикл оператора select и меню отображается заново.
но вы не можете поместить такой список в скалярную переменную из-за пробелов в одном из вариантов.
Вы также можете использовать файловый глобус, если вы выбираете между файлами:
Вы можете использовать этот простой сценарий для создания опций
Не новый ответ как таковой, но так как ответа пока нет, вот несколько советов и хитростей кодирования, как для select, так и для zenity:
Оба цикла будут циклически повторяться до тех пор, пока пользователь явно не выберет Quit (или Cancel для zenity). Это хороший подход для интерактивных меню сценария: после того, как выбор выбран и действие выполнено, меню снова представлено для другого выбора. Если выбор предназначен только для одноразового использования, просто используйте break после esac (зенитетность также может быть снижена)
Оба случая case основаны на индексе, а не на значении. Я думаю, что это легче закодировать и поддерживать
Массив также используется для zenity подхода.
Опция «Quit» не входит в число исходных, оригинальных опций. Она «добавляется» при необходимости, поэтому ваш массив остается чистым. Afterall, «Quit» все равно не нужен для zenity, пользователь может просто нажать «Cancel» (или закрыть окно), чтобы выйти. Заметьте, как оба используют один и тот же нетронутый массив опций.
PS3 и REPLY vars могут быть переименованы в not. Выбор жестко закодирован для использования этих опций. Все остальные переменные в скрипте (opt, options, prompt, title) могут иметь любые имена, при условии, что вы выполните настройки
Bash Select (Создание Меню)
Главное меню » Linux » Bash Select (Создание Меню)
Конструкция select позволяет генерировать меню.
Конструкции select в Bash
Конструкция select создает меню из списка элементов. Она имеет почти такой же синтаксис, что и цикл for:
[LIST] – может быть последовательность строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. д. Настраиваемое приглашение для конструкции select может быть задано с помощью переменной среды PS3.
Когда вызывается конструкция select, каждый элемент из списка печатается на экране (стандартная ошибка), которому предшествует номер.
Если пользователь вводит число, соответствующее номеру одного из отображаемых элементов, то [ITEM] для этого элемента устанавливается значение. Значение выбранного элемента сохраняется в переменной REPLY. В противном случае, если пользовательский ввод пуст, подсказка и список меню отображаются снова.
Чтобы продемонстрировать, как работает конструкция select, давайте рассмотрим следующий простой пример:
Скрипт отобразит меню, состоящее из пунктов списка с сопровождающим номером и подсказкой PS3. Когда пользователь вводит число, скрипт напечатает выбранный символ и номер:
Пример select в Bash
Как правило, select используется в сочетании с case и заявлением if.
Давайте посмотрим на более практичный пример. Это простой калькулятор, который запрашивает у пользователя ввод и выполняет основные арифметические операции, такие как сложение, вычитание, умножение и деление.
Когда скрипт выполняется, он отображает меню и подсказку PS3. Пользователю предлагается выбрать операцию, а затем ввести два числа. В зависимости от ввода пользователя скрипт напечатает результат. Пользователю будет предложено выполнить новую операцию после каждого выбора, пока команда break не будет выполнена.
Недостатком этого скрипта является то, что он может работать только с целыми числами.
Вот немного более продвинутая версия. Мы используем инструмент bc, который поддерживает плавающие числа для выполнения математических вычислений. Кроме того, повторяющийся код сгруппирован внутри функции.
Вывод
Конструкция select позволяет легко создавать меню. Это особенно полезно при написании сценариев оболочки, которые требуют ввода данных пользователем.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Локализация своих скриптов на BASH
Создание меню на BASH — задача сама по себе не сложная: «case тебе в руки и echo в спину». Решая её в очередной раз, мне захотелось добавить возможность отображать текст на других языках. Осталось решить, как сделать сам процесс локализации меню более удобным. Если оно большое, то решение «в лоб» превратит его в громоздкую копипасту. Здесь я хотел бы поделиться тем, как решил эту проблему для себя. Надеюсь, для кого то это будет небезынтересным.
Чтобы статья не вылилась в скучную простыню с излишком кода, решил разбить её на две части. В первой рассмотрим создание и добавление дополнительных языков. Во второй — создание многоуровнего меню и сохранение настроек
Я вполне понимаю и принимаю, что существуют и другие языки программирования. Как когда-то кто-то сказал здесь на Хабре — если при написании скрипта на BASH возникает необходимость хоть в одной функции, то лучше взять нормальный язык. Я с этим согласен, но иногда, как говорится, хочется, потому что хочется.
Мне не хотелось бы разбивать скрипт на несколько частей и хранить локализацию в отдельных файлах. Скрипт тем и удобен, что его проще использовать одним файлом. Поэтому тексты будем хранить в массивах.
Реализация будет состоять из:
Теперь рассмотрим подробнее
Зададим язык, добавив короткий буквенный код языка (ru, en), для начала английский:
Добавим массивы слов и предложений (по количеству языков):
Создадим косвенную ссылку и сформируем из неё новый массив в переменной lng:
То есть здесь для переменной lng создаётся значение, состоящее из части имени массива со словами и кода заданного языка из переменной langset. Далее создаётся массив, который при langset=en будет равен language_en, а при langset=ru будет равен language_ru.
Если языков будет много, то такой подход позволит избавиться от многочисленных if-elif или case. Чтобы изменить язык, достаточно будет добавить массив с переводом и установить язык в переменной langset.
Запустим всё это в консоли:
Таким образом, указывая в начале скрипта двухбуквенный код языка, можно задавать вывод одних и тех же слов или фраз на разных языках.
Построение меню
А теперь попробуем создать скрипт.
Для примера я взял меню управления командами Git через CLI (command line interface). Это немного надуманно, но хорошо подходит для примера, так как в Git много команд и как раз можно построить единое по своей задаче меню с множеством параметров.
Для начала задаем язык и массив с пунктами меню как это уже делали выше. Ради удобства, я разделил массив на две части: первая — это непосредственно меню, вторая — информационные сообщения и приглашения командной строки, которые необходимо будет вывести по ходу работы.
Пройдемся по массивам и создадим новые для lng и msg, которые и будут использоваться:
Чтобы при необходимости иметь возможность применять языковые настройки (это пригодится в следующей статье), заключим всё в функцию и тут же вызовем её.
Небольшое отступление: я уверен, почти всем встречались наполовину переведённые приложения. Особенно этим грешат кастомные прошивки для телефонов. Мне никогда это не нравилось, но в данном случае я всё же решил предусмотреть такую возможность неполного перевода. Это позволит при добавлении нового языка не дублировать все элементы массива, а добавить только те, которые пользователю хотелось бы перевести.
Для этого в цикле сравним созданный массив с англоязычным (английский считаем языком по умолчанию): если записи не существует (либо элемент массива пуст), дополним англоязычным вариантом.
Теперь, когда с языками разобрались, приступим к построению меню. Тут всё стандартно: бесконечный цикл, внутри него цикл для вывода элементов на экран и выбор вариантов через case.
Формируем массив для вывода на экран. Только те пункты, которые нам нужны:
Здесь делаем индексацию с 1, чтобы выводить индекс как соответствующий пункт меню.
Добавляем шапку, пробегаемся по индексам через $ и выводим на экран:
Ну и заключительный оператор выбора case с обработкой введенного значения:
Здесь case сделан упрощенным, только для примера. В следующей статье я буду использовать его в более универсальном варианте.
Это первая статья из двух. В следующей рассмотрим создание многоуровнего меню, разукрасим вывод (как же без этого), а также попробуем сохранить настройки, то есть задать код языка прямо из меню, не открывая Shell-скрипт в текстовом редакторе.
Спасибо, что дочитали до конца. Надеюсь, было не скучно.