Сценарий Bash, позволяющий пользователю выбирать из списка или вводить свои собственные

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

Это то, что у меня есть на данный момент.

read -p "Please select from the list below or enter the build number you would like to download " build
    case {build} in
        Latest)
            build=lastSuccessful
            break;;
        *)
            break;;
    esac

Проблема в том, что он не предоставляет список для выбора пользователем.

В идеале это должно выглядеть примерно так

Варианты сборки 1) Последняя 3) Успешная 5) выберите номер сборки (1-10000) 2) Стабильная 4) и т. д. Выберите из списка выше или введите номер сборки, которую хотите загрузить: _

Или было бы лучше сделать это в двух операторах case? Спросить, хотят ли они выбрать конкретную сборку или ввести свою собственную.

ОБНОВЛЕНИЕ: после некоторого размышления я упростил его до утверждения «да-нет».

while true;do
    read -p "Would you like to download the latest successful build? (yes/no) " yn
    case $yn in
        [Yy]*)
            echo
            build=lastSuccessfulBuild
            break;;
        [Nn]*)
            echo
            read -p "Enter the build number to download: " build
            break;;
        *) echo 'I am not going to tell you again';;
        [Qq]*) exit 0;;
    esac
done

person krodami    schedule 09.02.2015    source источник
comment
Распечатайте список перед оператором read, а затем произнесите list above.   -  person Barmar    schedule 10.02.2015
comment
какая часть select area in area1 area2 area3 в ответе, который вы приняли, вы не понимаете ( stackoverflow.com/questions/28377618/) .   -  person shellter    schedule 10.02.2015


Ответы (2)


Оператор select может быть тем, что вам нужно:

select name in Latest Successful  Stable "Pick a Build Number" ;
do
  case "$name" in
        Latest)
            build=lastSuccessful
            break
          ;;
        Successful)
            build=lastSuccessful
            break
          ;;
        Stable)
            build=lastSuccessful
            break
            ;;
        Pick*)
            read -p "Enter a number from 1 to 10000: " number
            break
            ;;
  esac
done

Это генерирует меню:

1) Latest
2) Successful
3) Stable
4) Pick a Build Number
#?

Пользователь может ввести 1, 2 или 3, а для переменной name будет задана соответствующая строка.

person John1024    schedule 09.02.2015
comment
Но это ограничит варианты, которые пользователь может выбрать, не так ли? Я хочу, чтобы они также могли выбрать число, и это число может варьироваться от 1 до 10000. - person krodami; 10.02.2015
comment
@krodami хорошо. Я добавил возможность ввода номера. - person John1024; 10.02.2015

Вам также может понравиться dialog.

Проверьте это:

dialog --no-cancel --menu "Please select from the list below or enter the build number you would like to download " 11 60 12 1 Latest 2 Successful 3 Stable
person pawel7318    schedule 09.02.2015