Я настраиваю сценарий оболочки с menues и sub menues, опциями, и т.д. Но в каждом меню/подменю/и т.д., мне нужно, "Возвращаются к главному меню" выбор.
Я уже разбудил набор меню, и он хорошо работает, но мне нужен способ просто перезапустить сценарий с нуля, сбросить все переменные и т.д. и т.д.
Или способ выйти из текущего сценария и запуска его снова.
Я попытался сделать это:
ScriptLoc=$(readlink -f "$0")
./ScriptLoc
Но это запускает "новый" сценарий в "старом" сценарии, поэтому когда я выхожу из "нового" сценария, он возвращается к "старому" сценарию (если это имеет какой-либо смысл). Это - сценарий в виде сценария вещи.
Кто-либо понял, как перезапустить его полностью?
Можно использовать что-то вроде этого:
$(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
локальная переменная сценария), затем сценарий никогда не будет останавливаться.
Надежно получить сценарий, который в данный момент выполняется, сложнее, чем вы думаете. См. 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
По сути, вы запускаете функцию main_menu в подоболочке, поэтому если вы выходите из main_menu или из любого из подменю, вы выходите из подоболочка, а не основная оболочка. статус выхода 255 выбран здесь, чтобы означать «идти снова». Любое другое состояние выхода выйдет из бесконечного цикла.