How to completely restart script from inside the script itself

I'm setting up a shell script with menues and sub menues, options, etc. But on each menu/submenu/etc, i need a "Go back to main menu" choice.

I've already got the menu set up and it works fine, but i need a way to simply restart the script from scratch, reset all variables etc etc.

Or a way to exit the current script and starting it again.

I've tried to do this:

ScriptLoc=$(readlink -f "$0")
./ScriptLoc

But that starts the "new" script inside the "old" script, so when i exit the "new" script, it goes back to the "old" script (if that makes any sense). It's a script inside a script kind of thing.

Anyone got an idea how to restart it completely?


Solution 1:

Yes, do

exec "$ScriptLoc"

The exec bash builtin command replaces the current program with a new one.

Solution 2:

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.