Я новичок в Bash, но я хотел бы создать скрипт, в котором я бы хотел, чтобы пользователь мог выбрать несколько вариантов из списка вариантов.
По сути, я хотел бы что-то похожее на пример ниже:
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
(Источник: http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1 )
Однако в моем сценарии было бы больше опций, и я бы хотел, чтобы были выбраны кратные числа. Так что-то вроде этого:
1) Вариант 1
2) Вариант 2
3) Вариант 3
4) Вариант 4
5) Готово
Было бы замечательно иметь отзывы о тех, кого они выбрали, например, плюсики рядом с теми, которые они уже выбрали. Например, если вы выберете «1», я бы хотел, чтобы страницу очистили и перепечатали:
1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done
Затем, если вы выберете «3»:
1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Кроме того, если они снова выбрали (1), я бы хотел, чтобы он отменил выбор опции:
1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done
И наконец, когда нажата кнопка «Готово», я бы хотел, чтобы список тех, которые были выбраны, отображался до выхода из программы, например, если текущее состояние:
1) Option 1
2) Option 2 +
3) Option 3 +
4) Option 4 +
5) Done
Нажатие 5 должно напечатать:
Option 2, Option 3, Option 4
... и сценарий завершается.
Итак, мой вопрос - возможно ли это в bash, и если да, то может ли кто-нибудь предоставить пример кода?
Любые советы будут высоко ценится.
Если вы думаете, что
whiptail
это сложно, то здесь идет код только для bash, который делает именно то , что вы хотите. Это коротко (~ 20 строк), но немного загадочно для начинающего. Помимо отображения «+» для отмеченных опций, он также предоставляет обратную связь для каждого действия пользователя («недопустимая опция», «опция X была отмечена» / не отмечена и т. Д.).Тем не менее, вы идете!
Надеюсь, вам понравится ... это было довольно весело сделать это :)
источник
while menu && read -rp "$prompt" nums && [[ "$nums" ]]; do while read num; do ... done < <(echo $nums |sed "s/ /\n/g") done
git bash
в Windows!Вот способ сделать именно то, что вы хотите, используя только функции Bash без внешних зависимостей. Он отмечает текущие выборы и позволяет переключать их.
Для ksh измените первые две строки функции:
и Шебанг в
#!/bin/ksh
.источник
options=(*)
(или другие шаблоны глобализации ) получат список файлов в массиве. Сложной задачей было бы получить массив меток выделения (${opts[@]}
), упакованный вместе с ним. Это можно сделать с помощьюfor
цикла, но его нужно будет выполнять для каждого прохода через внешнийwhile
цикл. Возможно, вы захотите рассмотреть возможность использованияdialog
или,whiptail
как я уже упоминал в моем другом ответе - хотя это внешние зависимости.${opts[@]}
и сохранить строку, переданную в качестве дополнительного аргумента функции вместо+
).Я написал библиотеку под названием Анкета , которая представляет собой мини-DSL для создания анкет из командной строки. Он предлагает пользователю ответить на ряд вопросов и распечатывает ответы на стандартный вывод.
Это делает вашу задачу действительно легкой. Установите его
pip install questionnaire
и создайте скрипт, напримерquestions.py
, так:Тогда беги
python questions.py
. Когда вы закончите отвечать на вопросы, они будут напечатаны на стандартный вывод. Он работает с Python 2 и 3, один из которых почти наверняка установлен в вашей системе.Он может обрабатывать и более сложные анкеты, если кто-то захочет это сделать. Вот некоторые особенности:
источник
Я использовал пример из MestreLion и набросал код ниже. Все, что вам нужно сделать, это обновить параметры и действия в первых двух разделах.
источник
n1 SELECTION
важная часть для увеличения количества цифр ..-n2 SELECTION
будет принимать две цифры (например, 15),-n3
принимает три (например, 153) и т. д.Вот функция bash, которая позволяет пользователю выбрать несколько опций с помощью клавиш со стрелками и пробела, и подтвердить с помощью Enter. У этого есть хорошее подобное меню чувство. Я написал это с помощью /unix//a/415155 . Это можно назвать так:
Результат сохраняется в виде массива в переменной с именем, указанным в качестве первого аргумента. Последний аргумент является необязательным и используется для выбора некоторых параметров по умолчанию. Похоже на это.
источник
Поскольку я не нашел подходящего BASH-альтернатива для prompt-toolkit (python), dialoguer (rust) или inquirer (node), я попробовал сам:
https://i.stack.imgur.com/6AyAI.png
https://asciinema.org/a/Y4hLxnN20JtAlrn3hsC6dCRn8 https://gist.github.com/blurayne/f63c5a8521c0eeab8e9afd8baa45c65e
источник
источник
easybashgui
.