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!
menu.sh
output into a variable? something else? fwiw, assuming the only contents ofmain.sh
is./menu.sh
... the script works for me, ie, runningmain.sh
from the command line displays the menu in my window (aka stdout)tput
and key reading magic relevant, or can you remove that and still show the problem you're encountering (minimal reproducible example)?val=$(./menu.sh)
(obvously) redirects stdout into the ariableval
hence the reason your stdout 'disappears' ("Duh, Mark!" ?); while there's probably a way to redirect 'some' of stdout to a variable, the addition oftput
calls and specialized cursor codes is going to add more complexity to the mix; at this point the provided script is (somewhat) complex and (imo) detracts from the true issue which is ... ?? what ?? ... you want to access the last line of the displayed menu? at this point I'm not sure what it is you're trying to accomplish ....menu.sh
to a minimum set of code that generates the desired output, then tell us what part of this output you want 'redirected' tomain.sh
; some idea of what you want to so with the redirected data would also help (eg, store in variable? store in array? something else)? once you get something working for the minimal case then you can proceed to figuring out how to apply to your actual code