Как создать динамические варианты множественного выбора с помощью диалога CMD в Bash - PullRequest
0 голосов
/ 13 марта 2019

У меня не получается открыть диалоговое окно с несколькими вариантами выбора.

Вот упрощенная версия того, что я пытаюсь выполнить в диалоговом окне:

Menu Selection
"Pick one or more options:"
1) Option 1
2) Option 2
3) Option 3

        <select>               <exit>

Где пользователь видит это при выборе:

"Pick one or more options:"
 * 1) Option 1
 * 2) Option 2
 3) Option 3

            <select>               <exit>

А при вводе ключа при выборе видит: Msgstr "Вы выбрали опции 1 и 2".

Вот что у меня есть:

#!/bin/bash

#initialize
MENU_OPTIONS=
COUNT=0

IFS=$'\n'

#get menu options populated from file
for i in `cat my_input_file.log`
do
       COUNT=$[COUNT+1]
       MENU_OPTIONS="${MENU_OPTIONS} $i ${COUNT} off "
done

#build dialogue box with menu options
cmd=(dialog --backtitle "Menu Selection" --checklist "Pick 1 or more options" 22 30 16)
options=(${MENU_OPTIONS})
choices=$("${cmd[@]}" "${options[@]}" 2>&1 1>/dev/tty)

#do something with the choices
for choice in $choices
do
        echo $choice selected
done

При запуске этого (./menu.bash) на CLI я получаю следующее:

Error: Expected at least 7 tokens for --checklist, have 5. selected
Use --help to list options. selected

Чего мне не хватает?

1 Ответ

1 голос
/ 13 марта 2019

Проблема заключается в том, как вы строите массив options. так как вы определили IFS=$'\n' в коде, использование options=($MENU_OPTIONS) создаст только элемент 1 в этом массиве, пока вы ищете 9 элементов. Чтобы устранить эту проблему, вы можете заменить пробелы на $ '\ n' в следующей строке кода: (примечание: вам также нужно будет unset IFS до for choice in $choices; do ...; done)

MENU_OPTIONS="${MENU_OPTIONS} $i ${COUNT} off "

до

MENU_OPTIONS="${MENU_OPTIONS}"$'\n'${COUNT}$'\n'$i$'\n'off

Или измените код для настройки массива options, например:

#!/bin/bash

#initialize
COUNT=0

while IFS=$'\n' read -r opt; do
    COUNT=$(( COUNT+1 ))
    options+=($COUNT "$opt" off)
done <my_input_file.log

#build dialogue box with menu options
cmd=(dialog --backtitle "Menu Selection" --checklist "Pick 1 or more options" 22 30 16)
choices=($("${cmd[@]}" "${options[@]}" 2>&1 1>/dev/tty))

for choice in "${choices[@]}"; do
    echo "$choice selected"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...