Меню Bash Case - динамический выбор - PullRequest
3 голосов
/ 11 ноября 2009

Я не уверен, какова политика при задании последующих вопросов. Пожалуйста, извините, если я нарушаю протокол. Ранее я создавал меню в 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. Но не лучше ли искать цифры?

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

Ответы [ 2 ]

2 голосов
/ 11 ноября 2009

Я бы сделал некоторые проверки на $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.
1 голос
/ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...