Bash如何return值从下标到主脚本?
Bash how to return value from subscript to main script?
我将以下脚本保存到 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
的输出?
由于某种原因,我无法通过管道或重定向获得对标准输出的回显。通过 $() 访问它也不起作用。我做错了什么?
在此先感谢您的帮助!
一种方法是使用另一个文件来存储结果。
在您的 main.sh 中,想出一个临时文件名。
将此临时文件名提供给 menu.sh
在menu.sh中添加一些处理以确保在继续之前提供此文件。
将 menu.sh 的结果更改为写入临时文件
返回 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 [ "" == "" ] ; then
exit "You need to supply a temp file path"
fi
RESULTS_FILE=
在menu.sh的底部,更改最后一行写入文件:
echo "Selected item $cur: ${menu[$cur]}" > $RESULTS_FILE
我将以下脚本保存到 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
的输出?
由于某种原因,我无法通过管道或重定向获得对标准输出的回显。通过 $() 访问它也不起作用。我做错了什么?
在此先感谢您的帮助!
一种方法是使用另一个文件来存储结果。
在您的 main.sh 中,想出一个临时文件名。 将此临时文件名提供给 menu.sh
在menu.sh中添加一些处理以确保在继续之前提供此文件。 将 menu.sh 的结果更改为写入临时文件
返回 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 [ "" == "" ] ; then
exit "You need to supply a temp file path"
fi
RESULTS_FILE=
在menu.sh的底部,更改最后一行写入文件:
echo "Selected item $cur: ${menu[$cur]}" > $RESULTS_FILE