Home > database >  Bash how to return value from subscript to main script?
Bash how to return value from subscript to main script?

Time:01-28

I have the following script saved into a menu.sh file.

declare -a menu=("Option 1" "Option 2" "Option 3" "Option 4" "Option 5" "Option 6")
cur=0

draw_menu() {
    for i in "${menu[@]}"; do
        if [[ ${menu[$cur]} == $i ]]; then
            tput setaf 2; echo " > $i"; tput sgr0
        else
            echo "   $i";
        fi
    done
}

clear_menu()  {
    for i in "${menu[@]}"; do tput cuu1; done
    tput ed
}

# Draw initial Menu
draw_menu
while read -sn1 key; do # 1 char (not delimiter), silent
    # Check for enter/space
    if [[ "$key" == "" ]]; then break; fi

    # catch multi-char special key sequences
    read -sn1 -t 0.001 k1; read -sn1 -t 0.001 k2; read -sn1 -t 0.001 k3
    key =${k1}${k2}${k3}

    case "$key" in
        # cursor up, left: previous item
        i|j|$'\e[A'|$'\e0A'|$'\e[D'|$'\e0D') ((cur > 0)) && ((cur--));;
        # cursor down, right: next item
        k|l|$'\e[B'|$'\e0B'|$'\e[C'|$'\e0C') ((cur < ${#menu[@]}-1)) && ((cur  ));;
        # home: first item
        $'\e[1~'|$'\e0H'|$'\e[H')  cur=0;;
        # end: last item
        $'\e[4~'|$'\e0F'|$'\e[F') ((cur=${#menu[@]}-1));;
         # q, carriage return: quit
        q|''|$'\e')echo "Aborted." && exit;;
    esac
    # Redraw menu
    clear_menu
    draw_menu
done

echo "Selected item $cur: ${menu[$cur]}";

I now have a second main.sh where i call the menu.sh file like this: ./menu.sh (they are in the same directory). How can i get the output of the menu.sh from the main.sh? I can't get the echo to the standard output by piping or redirecting for some reason. Accessing it via $() also doesn't work. What am i doing wrong?

Thanks in advance for all helpt!

CodePudding user response:

One approach would be to use another file to store the result.

  1. In your main.sh, come up with a temp file name. Supply this temp file name to menu.sh

  2. Add some handling in menu.sh to ensure that this file is supplied before going on. Change the result of menu.sh to write to the temp file

  3. Back in main.sh, read the results from the temp file. Then get rid of the file

So, here is main.sh

RESULTS_FILE=results.`date  %s`.txt
./menu.sh $RESULTS_FILE
RESULTS=`cat $RESULTS_FILE`
echo "Got results:"
echo $RESULTS
rm $RESULTS_FILE

And then here is how you'd modify menu.sh

At the top

if [ "$1" == "" ] ; then 
    exit "You need to supply a temp file path"
fi
RESULTS_FILE=$1

At the bottom of menu.sh, change the last line to write to the file:

echo "Selected item $cur: ${menu[$cur]}" > $RESULTS_FILE

  •  Tags:  
  • Related