dialog
был бы совсем негибким инструментом, если бы не было возможности формировать элементы меню более-менее «налету», а не только непосредственно в коде скрипта. И такая возможность есть. Виджет --menu
(а также --checklist
и --radiolist
, которые я здесь упущу), принимают на вход массив. Формат массива такой:
MNUARR[0]="Элемент 1"
MNUARR[1]="Описание 1"
MNUARR[2]="Элемент 2"
MNUARR[3]="Описание 2"
...
т.е. линейный массив, где в первый элемент записывается, извиняюсь за тавтологию, элемент, а в следующий — описание, далее все повторяется.
Массив будем брать из файла.
1. Определяем переменную с путем к файлу и массив:
MNUFILE="./dynmenu01.txt"
declare -a MNUARR
2. Заполняем массив:
IDX=0 while read LINE; do PT_1=`echo "$LINE"|awk '{print $1}'` PT_2=`echo "$LINE"|awk '{print $2}'` MNUARR[$IDX]=$PT_1 let "IDX=IDX+1" MNUARR[$IDX]=$PT_2 let "IDX=IDX+1" done <"$MNUFILE"
3. Вызываем dialog
:
dialog --clear \ --title "Dynamic menu" \ --menu "Select option:" \ 20 76 10 \ "${MNUARR[@]}"
Массивом, на самом деле, пользоваться неудобно, и код получается более громоздкий, и несовместимо это может оказаться с другими shell’ами, и возможностей у массива меньше. Есть другой выход — воспользоваться файлом специального формата. Для виджета --menu
формат таков:
"Элемент 1"[пробел]"Описание 1"[пробел]\
"Элемент 2"[пробел]"Описание 2"[пробел]\
Собственно, от описания меню в коде ничем не отличающийся. Можно даже в одну строчку через пробелы все написать, но с пробелом и \ в конце строки симпатичнее.
Остается в параметре --file
виджета --menu
указать путь к файлу.
MNUFILE="./dynmenu-file.txt" dialog --clear \ --title "Dynamic menu" \ --menu "Select option:" \ 20 76 10 \ --file "$MNUFILE" \
С помошью общего для dialog
ключа --item-help
можно добавить к элементам подсказку, появляющуюся в выделенной строке внизу экрана. Подсказка ограничена количеством символов в строке, что не влезло — уползает за экран.
Формат файла для такого меню будет:
"Элемент 1"[пробел]"Описание 1"[пробел]"Помощь 1"[пробел]\
"Элемент 2"[пробел]"Описание 2"[пробел]"Помощь 1"[пробел]\
Точно также меню с помощью описывается и непосредственно в коде скрипта.
Вызов dialog
:
MNUFILE="./dynmenu-file-help.txt" dialog --clear \ --item-help \ --title "Dynamic menu" \ --menu "Select option:" \ 20 76 10 \ --file "$MNUFILE" \
Для динамического меню из массива это не работает (или я не понял как).
Конечно, виджет --menu
, это вам не DataGridView из .NET Framework, и вообще, отдельного виджета для отображения табличных данных у dialog
нет, но, если данных немного, то можно воспользоваться общим параметром для виджетов dialog
‘а
--column-separator
. Раз параметр общий, то кроме --menu
, должен срабатывать и для --checklist
и --radiolist
.
После параметра --column-separator
задаем, собственно, сам разделитель (в примере |
).
Примечание: параметр работает только для описаний пунктов меню.
MNUFILE="./dynmenu-file-sep.txt" dialog --clear \ --item-help \ --column-separator "|" \ --title "Dynamic menu" \ --menu "Select option:" \ 20 76 10 \ --file "$MNUFILE" \
Эта опция работает и для динамического меню, созданного с помощью массива: