Меню Bash Case — динамический выбор

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

И пока у меня это работает очень хорошо. Код здесь.

while [[ 1 ]]
do
    cat -n "$dumpfile"
    read -p "Please make a selection, select q to quit: " choice
    case $choice in
            # Check for digits
    [0-9] )   dtvariable=$(sed -n "$choice"p "$dumpfile")
              $dtvariable            ;;
     q|Q)
         break
           ;;
      *)
           echo "Invalid choice"
           ;;
    esac
done

За исключением того, что это отлично работает для пунктов меню до 9. Меню будет динамическим — может иметь 1 пункт, 20 пунктов или 197 пунктов. Я пытался изменить [0-9] на [0-9][0-9], чтобы посмотреть, потребуется ли 12. Но это не так. Может ли кто-нибудь поставить меня на правильный путь? Я полагаю, я мог бы просто удалить часть [0-9] и взять все, что не является q. Но не лучше ли поискать цифры?

Заранее спасибо.


person Chasester    schedule 11.11.2009    source источник


Ответы (2)


Я бы сделал некоторую проверку на $choice:

case $choice in
     # Check for digits
    +([0-9]))
        lines=($(wc -l ))
        if (( choice > 0 && choice <= lines ))
        then
            dtvariable=$(sed -n "$choice"p "$dumpfile")
            $dtvariable            ;;
        fi
# etc.
person Dennis Williamson    schedule 11.11.2009
comment
Спасибо Денис. Я пошел без части extglob - и она фантастически протестирована. - person Chasester; 11.11.2009

Вот что у меня есть на работе. Основные отличия заключаются в добавлении shopt -s extglob, который включает расширенное сопоставление с шаблоном, и шаблона +([0-9]), который является bash-эквивалентом регулярного выражения [0-9]+.

shopt -s extglob
while [[ 1 ]]
do
    read -p "Please make a selection, select q to quit: " choice
    case $choice in
            # Check for digits
    +([0-9]))  
         echo $choice ;;
     q|Q)
         break
           ;;
      *)
           echo "Invalid choice"
           ;;
    esac
done
person Jim Garrison    schedule 11.11.2009
comment
Спасибо, он выдает синтаксическую ошибку рядом с неожиданным токеном `(' ошибка прямо рядом с +([0-9])) Я не вижу лишних пробелов или чего-то еще. все еще смотрит. - person Chasester; 11.11.2009
comment
Вы обязательно добавили extglob? Без него работать не будет, так как синтаксис +(...) включен extglob. - person Jim Garrison; 11.11.2009