Вопрос об избранных меню в ударе

Прежде чем Вы скажете мне, что "уже существуют тонны руководств по этому", знают, что мне на самом деле сделали избранное меню, и оно работает.

Однако существует одна вещь, которая сводит меня с ума. Путем мне кодировали это меню в настоящее время, это - то, что происходит:

1) Пользователь выбирает опцию 2), перезагрузки Меню 3), Опция имеет asterick рядом с нею, чтобы показать, что она выбрана.

Проблема:

Пользователь должен выбрать каждую опцию по одному после перезагрузок меню после каждого выбора. Поскольку можно предположить, что это медленно, и сделайте окно терминала грязным.

Что я хочу:

Пользователь должен смочь к типу 1-4 или 1,4,7 выбрать несколько опций.

Что я не хочу:

Whiptail или Диалоговое окно. Я на самом деле делал тот также, и это безупречно. Однако я предпочел бы не использовать его, если я могу помочь ему или использовать его в качестве нейтрализации. Я думаю, что это было бы более удобно для пользователя (не говоря уже о более легком на глазах) для не использования того.

Код:

#                           #
### CSGO Plugin selection ###
#                           #

options=(
         "SurfTimer - 2.02 - Core of this server."
         "AutoFileLoader - Caches all material, model, and sound files for players to download."
         "Chat-Procesor - Chat Processing Plugin"
         "Dynamic - PreReq for many plugins to work properly."
         "FixAngles - Fixes 'wrong angle on material' error that gets spammed in console when using store items"
         "Mapchooser_Extended - Map Vote System. See maplist.cfg/mapcycle.cfg.")
....


menu() {
    echo "Avaliable options:"
    for i in ${!options[@]}; do
        printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${options[i]}"
    done
    [[ "$msg" ]] && echo "$msg"; :
}

prompt="Check an option (again to uncheck, ENTER when done): "
while menu && read -rp "$prompt" num && [[ "$num" ]]; do
    [[ "$num" != *[![:digit:]]* ]] &&
    (( num > 0 && num <= ${#options[@]} )) ||
    { msg="Invalid option: $num"; continue; }
    ((num--)); msg="${options[num]} was ${choices[num]:+un}checked"
    [[ "${choices[num]}" ]] && choices[num]="" || choices[num]="+"
done

printf "You selected"; msg=" nothing"
for i in ${!options[@]}; do
    [[ "${choices[i]}" ]] && { printf " %s" "${options[i]}"; msg=""; }
done
1
задан 12 March 2018 в 00:57

1 ответ

Я сделал бы это следующим образом:

menu() {
    clear
    echo "Available options:"
    for i in ${!options[@]}; do
        printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${options[i]}"
    done
}

prompt="Check an option (again to uncheck, ENTER when done): "
while menu && read -rp "$prompt" num && [[ "$num" ]]; do
    [[ "$num" =~ "-" ]] && num=$(seq $(sed -E 's/(\d*)-(\d*)/\1 \2/' <<<"$num"))
    for i in $num; do
      ((i--))
      [[ "${choices[i]}" ]] && choices[i]="" || choices[i]="*"
    done
done

Это тестирует если $num содержит дефис и создает диапазон при необходимости, затем просто циклы по содержанию $num так, чтобы пользователи могли дать несколько опций сразу с, например. 1 2 4 или 1-4 (но не комбинация тех!). Это также clears терминал каждый раз, прежде чем меню печатается.

2
ответ дан 7 December 2019 в 13:26

Другие вопросы по тегам:

Похожие вопросы: