Сценарий оболочки Bash, запрашивающий ввод у пользователя с помощью диалогового окна (CLI GUI) - PullRequest
1 голос
/ 13 февраля 2011

Привет и, прежде всего, спасибо всем, кто дает полезные ответы / указатели !!

Я пишу сценарий Bash, который иногда может потребовать ввода информации у пользователя.Я ищу инструмент для представления поля ввода (например, всплывающего окна с графическим интерфейсом) на уровне выполнения 3 (без X Windows), который предоставляет список выбора и опцию для ручного ввода.Он должен содержать переключатель рядом с каждой опцией.

Например, если бы он спрашивал у пользователя имя, он представлял бы список, подобный этому


(*) Джонни

() Бен

() Хиллари.

() <manual input>


Где строка <manual input> будет текстовым полем для разрешенияпользователь для ввода свободного текста.Вывод должен быть стандартным и должен называться, например, "Hillary".

В целом требования следующие:

1) Он должен появиться и быть ярким цветом, чтобы захватить пользователя.внимание.Плоский текст не подходит

2) Желательно разрешить выделение с помощью курсора или мыши

3) Предоставить список выбора переключателей

4) Также разрешить свободный ввод текста

5) Записать выбор в стандартный вывод

6) Я не хочу стирать сообщения о состоянии / журнале уже на экране

Команда чтения Bash не "достаточно кричащий, он не привлекает внимание пользователя.

Инструмент диалог стирает текст, уже находящийся на экране, так как он перерисовывает весь экран и не позволяетсписок выбора и поле для ввода свободного текста на одном экране.

Еще раз спасибо

MC

Ответы [ 2 ]

2 голосов
/ 17 июня 2015

, как предложено выше, диалоговые команды будут работать

Создайте диалог с --keep-tite, чтобы сохранить ваш экран после ввода, и использование --checklist делает возможным иметь поле выбора радио.Поместите все ответы в массив и сделайте цикл while для каждого элемента массива.

$ {# arrayName [@]} -> количество элементов в массиве или количество выборок $ {arrayName [@]}-> выводит все элементы массива

#!/bin/bash

result() {
i=0
echo there are ${#arrayName[@]} options selected
while (( i < ${#arrayName[@]} ))
do
  echo $i ${arrayName[$i]} 
  i=$(( $i + 1 ))
done
}

cmd=(dialog --separate-output --keep-tite --checklist "Select options:" 22 76 4)
options=(1 "Johnny" off
         2 "Ben" off
         3 "Hillary" off
         4 "User Input" off
)

choice=$("${cmd[@]}" "${options[@]}" 2>&1 > /dev/tty )

for answer in $choice
do
# make decsion 
case $answer in
    1) 
       arrayNum=${#arrayName[@]}  # arrayNum is the amount of items in arrayName 
       arrayName[$arrayNum]="Johnny" # if selected put Johnny in arrayName
       ;;
    2) 
       arrayNum=${#arrayName[@]}  # If johnny is selected ${#arrayName[@]} outputs 1 if not selected 0 
       arrayName[$arrayNum]="Ben" # If selected add to array
       ;;
    3) 
       arrayNum=${#arrayName[@]}
       arrayName[$arrayNum]="Hillary"
       ;;
    4) # If User Input is selected create an new dialog inputbox 

    user_input=$(\
    dialog --keep-tite --title "Enter Your Name" \
        --inputbox "Enter name:" 8 40 \
    3>&1 1>&2 2>&3 3>&- \
    )
       arrayNum=${#arrayName[@]}
       arrayName[$arrayNum]="$user_input"
       ;;
esac
done
result
0 голосов
/ 13 февраля 2011

Я могу придумать 3 способа. YMMV

  • Используйте Zenity (вероятно, дисквалифицирован, поскольку у вас нет X).
  • Использование диалоговое окно - Что касается исчезновения объекта на экране, структурируйте ваш скрипт так, чтобы он полностью использовал диалог и представлял даже информационный текст внутри виджетов. У него также есть опция --stdout для направления его вывода на стандартный вывод, чтобы он сохранялся. Whiptail - замена диалога, который, я считаю, легче.
  • Используйте tput и вручную перемещайте курсор, рисуйте цвета и т. Д., Чтобы выделить диалоговое окно. Это утомительно и подвержено ошибкам.

Мне не нравятся яркие цвета и вещи, особенно для нормального выбора. Я бы предпочел приглушенный read. Однако, если вы хотите сделать это, я бы порекомендовал второй подход. Ваше приложение должно либо использовать набор инструментов виджета, либо не использовать его. Не пытайтесь заставить это сделать оба. Это не стоит хлопот.

...