我正在设置一个带有菜单、子菜单、选项等的 shell 脚本。但在每个菜单/子菜单/等等上,我都需要一个“返回主菜单”选项。
我已经设置了菜单并且它运行良好,但我需要一种方法来简单地从头开始重新启动脚本,重置所有变量等等。
或者退出当前脚本并重新启动它的方法。
我曾尝试这样做:
ScriptLoc=$(readlink -f "$0")
./ScriptLoc
但是这会在“旧”脚本中启动“新”脚本,因此当我退出“新”脚本时,它会返回到“旧”脚本(如果这有任何意义的话)。这是一种脚本中的脚本。
有人知道如何彻底重启它吗?
答案1
答案2
您可以使用类似这样的方法:
$(basename $0) && exit
$(basename $0)
将创建当前脚本的新实例并exit
退出该脚本的当前实例。
下面是重点介绍上述方法的测试脚本:
#!/bin/bash
if ! [[ $count =~ ^[0-9]+$ ]] ; then
export count=0
fi
echo $count
if [ $count -le 10 ]; then
count=$(echo "$count+1" | bc)
./$(basename $0) && exit #this will run if started from the same folder
fi
echo "This will be printed only when the tenth instance of script is reached"
如果您不使用export count=0
(将其count
作为环境变量)而仅使用count=0
(将其作为cont
本地脚本变量),那么脚本将永远不会停止。
答案3
可靠地获取当前正在执行的脚本比你想象的要难。请参阅http://mywiki.wooledge.org/BashFAQ/028。
相反,你可以做这样的事情:
main_menu() {
printf '1. Do something cool\n'
printf '2. Do something awesome\n'
: ... etc
}
some_sub_sub_menu() {
...
printf 'X. Return to main menu\n'
...
if [[ $choice = [Xx] ]]; then
exit 255
fi
}
while true; do
(main_menu)
res=$?
if (( res != 255 )); then
break
fi
done
基本上,您在子 shell 中运行 main_menu 函数,因此如果您从 main_menu 或任何子菜单退出,则退出的是子 shell,而不是主 shell。此处选择退出状态 255 表示“再次执行”。任何其他退出状态都将跳出无限循环。
答案4
晚了,新手,但我必须使用绝对路径才能使我的工作:
exec "/usr/local/bin/audio-device-switch.sh"
(exec "$ScriptLoc" 对我来说不起作用)