2

I've many notes gleaned from the web and have written bash scripts to manage them.

I've some scripts working that depend on select to make menus.

Question: in a nested menu context, is it possible to revert to a preceding menu within the script ? I've a strong feeling that this may not be possible but am posting this in the hope there may be a way.

To explain what I mean: say the user makes a choice against menu-1 which then determines what shows up in menu-2 which follows. If the user selects "done" in menu-2, is there a loop device to bring the user back to menu-1 ?

The script below contains 3 selects - I'd like to be able to revert from the 3rd one back to the 2nd:

curd=($(ls)); # array

select dirup in ${curd[@]} done 

do


cd $dirup;
    ar=($(ls | awk -F"." '{ print $1 }' | awk -F"-" '{ for(i=2; i<=NF; i++) print $i }' | sort | uniq)); 


select choice in ${ar[@]} done # select list
    do 
        echo "you selected: $choice"
        [[ $choice == "done" ]] && exit 
        ar=($( find . -type f -maxdepth 1 -name "*$choice*" ));
        ((cnt=${#ar[@]}+1))
        select ntit in ${ar[@]} done
            do 
                echo "choice is:[ $REPLY ]"
                for i in $REPLY; # $REPLAY contains numbers
                    do
                      if [ $i -lt $cnt ]
                        then 
                            ((var=$i-1)); 
                            open ${ar[$var]}; 
                        else 
                            exit
                      fi
                    done

            done

      done

done
syntaxerror
  • 2,236
  • 2
  • 27
  • 49
Tom
  • 87
  • 7
  • Ugh. The first `ar=...` one-liner parses ls; this is not recommended at all. And should you insist on parsing ls after all, use preferably `ls | cut -f1 -d.` instead: way less typing effort. __Caveat__: Both your and my solutions will also mistake *anything* following a `.` (dot) for an extension. For example, a file called invoice.miller.txt will be shown as "invoice", not "invoice.miller". -- Lastly: For first line, to avoid regular files, use `find . -maxdepth 1 -type d`. – syntaxerror Nov 20 '14 at 10:10

1 Answers1

1

Use break instead of exit. Note, though, that the menu is not reprinted when returning to a higher menu.

Example:

select x in nothing inner quit ; do
    [[ $x == quit ]] && break
    if [[ $x == inner ]] ; then
        select y in NOTHING BACK ; do
            [[ $y == BACK ]] && break
        done
    fi
done
choroba
  • 45,735
  • 7
  • 84
  • 110