How to completely restart script from inside the script itself
Yes, do
exec "$ScriptLoc"
The exec
bash builtin command replaces the current program with a new one.
You can use something like this:
$(basename $0) && exit
$(basename $0)
will create a new instance of the current script and exit
will exit from the curent instance of the script.
Here is a test script that highlights the above method:
#!/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"
If you don't use export count=0
(which make count
to be an environment variable) and use only count=0
(which make cont
a local script variable), then the script will never stop.
Reliably getting the script that's currently executing is harder than you might think. See http://mywiki.wooledge.org/BashFAQ/028.
Instead, you could do something like this:
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
Basicly, you run the main_menu function in a subshell, so if you exit from the main_menu, or any of the sub menus, you exit the subshell, not the main shell. exit status 255 is chosen here to mean "go again". Any other exit status will break out of the otherwise infinite loop.