Issue
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!
Solution
One approach would be to use another file to store the result.
In your main.sh, come up with a temp file name. Supply this temp file name to menu.sh
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
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
Answered By - Elaine Alt Answer Checked By - David Goodson (WPSolving Volunteer)