Вопрос о выборе меню в bash

Похоже, что новое обновление устраняет эту проблему. Запуск apt update и apt full-upgrade должен устранить его.

1
задан 12 March 2018 в 01:57

3 ответа

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

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 (но не их комбинация!). Он также clear является терминалом каждый раз перед тем, как печатается меню.

2
ответ дан 22 May 2018 в 12:38
  • 1
    Безупречный! Спасибо! Хотя у меня проблемы с диапазоном. Я довольно новичок в bash, поэтому я мог просто помещать его в неправильное место. Я предполагаю, что он должен идти сразу после цикла for, но внутри цикла while? – Sandman007 12 March 2018 в 03:20
  • 2
    Хм еще не работает. Я сделал это прямо перед циклом for. Но если вы не можете понять это, не беспокойтесь об этом. Вы уже очень помогли! – Sandman007 12 March 2018 в 03:41
  • 3
    @ Sandman007 Действительно? Я редактировал его, он отлично работает для меня с GNU bash 4.3.48(1) ... – dessert 12 March 2018 в 03:55

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

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 (но не их комбинация!). Он также clear является терминалом каждый раз перед тем, как печатается меню.

2
ответ дан 17 July 2018 в 19:04

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

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 (но не их комбинация!). Он также clear является терминалом каждый раз перед тем, как печатается меню.

2
ответ дан 23 July 2018 в 19:50

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

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