2015-07-02 3 views
0

Я попытался скомпоновать скрипт, чтобы перечислить различные каталоги jws и разрешить пользователю выбирать разные клиентские каталоги, прежде чем продолжить редактирование jnlp-файлов в каталоге. У меня есть часть редактирования, у меня есть меню, работающее в основном; Я не могу понять, как выйти из цикла после того, как были сделаны выборы.bash интерактивное меню, выход на пустой вход

Я бы хотел, чтобы он вышел после того, как ENTER нажал без выбора номера и продолжит следующую часть скрипта.

function update_jnlp 
{ 
while : 
    do 
# JNLP update submenu 

options=($(ls /tmp/test/ | grep "jws$")) 

menu() { 
    clear 
    echo "Locally installed jnlps:" 
    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 
    done 
    for i in ${choices[@]}; do 
      printf "%s\n" ${choices[@]}; 
    echo "fun" 
     done 
     echo "@msg" 
# here is the script to edit the files now contained as ${choices[@]} 
} 

Я признаю, что я нахожусь в цикле меню, и что мне нужно проверить, что входные данные от команды чтения = «» или что приглашение ввод $ имеет нулевое значение, и я предполагаю, что я нарушу оттуда

+0

«* Я признаю, что я нахожусь в цикле меню и что мне нужно проверить этот ввод с помощью команды чтения =" "или что ввод $ prompt является нулевым, и я предполагаю, что я отрываюсь отсюда *" Вы пробовали это ? – ShellFish

+0

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

+0

* $ prompt input is null * Какое значение должно быть '$ prompt' должно быть« null »? Попробуйте распечатать его и посмотреть, что он содержит, если вы имеете в виду, когда он не установлен, попробуйте '[" $ prompt "] || break'. 'Read' хранится в' $ num'. Чтобы убедиться, что это пустая строка, используйте точно такой же '[" $ num "] || break'. – ShellFish

ответ

1

Пожалуйста, форматируйте свой код более читабельно. Как бы то ни было, неустойчивый отступ делает его близким к нечитаемому. Ну, отступ в сочетании с определением функции в теле цикла внутри другой функции и некоторыми более непостижимыми телами цикла, которые я когда-либо видел. (. Я думал, что я видел довольно много, ясно, у меня еще есть некоторое обучение, чтобы сделать)

С кодом отформатированный несколько более ортодоксально, у вас есть:

function update_jnlp 
{ 
    while : 
    do 
     # JNLP update submenu 
     options=($(ls /tmp/test/ | grep "jws$")) 

     menu() { 
      clear 
      echo "Locally installed jnlps:" 
      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 

     echo "$msg" # Added 
     break   # Added 

    done 

    for i in ${choices[@]}; do 
     printf "%s\n" ${choices[@]}; 
     echo "fun" 
    done 
    echo "@msg" 
    # here is the script to edit the files now contained as ${choices[@]} 
} 

Когда я побежал , я выбрал 1, 3, 7, а затем нажмите возврат, и последняя страница выхода выглядела как:

Locally installed jnlps: 
    1+) abc.jws 
    2) def.jws 
    3+) ghi.jws 
    4) jkl.jws 
    5) mno.jws 
    6) pqr.jws 
    7+) stu.jws 
    8) vwx.jws 
    9) xyz.jws 
stu.jws was checked 
Check an option (again to uncheck, ENTER when done): 
You selected abc.jws ghi.jws stu.jws 
+ 
+ 
+ 
fun 
+ 
+ 
+ 
fun 
+ 
+ 
+ 
fun 
@msg 

без добавления break, вы не можете видеть, что выбран потому, что внешний while : цикл очищает экран слишком быстро. Добавив echo "$msg", вы получите You selected nothing, как хотите.

Материал после основной петли while :, очевидно, не завершен.

На самом деле, вам не нужна петля while : вообще или неполный материал. Вы можете использовать:

function update_jnlp 
{ 
    # JNLP update submenu 
    options=($(ls /tmp/test/ | grep "jws$")) 

    menu() { 
     clear 
     echo "Locally installed jnlps:" 
     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 && [[ -n "$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 
    echo "$msg" 

} 

Это все еще довольно неисповедимы, но, по крайней мере, он работает более или менее здраво.

Смежные вопросы