shell Bash如何从下标返回值到主脚本?

qnzebej0  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(152)

我将以下脚本保存到一个menu.sh文件中。

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]}";

现在我有了第二个main.sh,其中我这样调用menu.sh文件:./menu.sh(它们在同一个目录中)。我如何从main.sh得到menu.sh的输出?由于某种原因,我无法通过管道或重定向得到标准输出的回应。通过$()访问它也不起作用。我做错了什么?
提前感谢所有的帮助!

xkrw2x1b

xkrw2x1b1#

一种方法是使用另一个文件来存储结果。
1.在www.example.com中main.sh,创建一个临时文件名menu.sh
1.在www.example.com中添加一些处理menu.sh,以确保在继续之前提供了此文件。
1.返回main.sh,从临时文件中读取结果,然后删除文件
这里是main.sh

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

下面是如何修改menu.sh
在顶部

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

在www.example.com的底部menu.sh,将最后一行更改为写入文件:

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

相关问题