我正在使用嵌套函数对连接到新Linux盒的驱动器进行分区并制作文件系统。 我在尝试打破所有循环时遇到了一个奇怪的问题。
我一直在跟踪嵌套循环索引,并使用“ break n”。 当用户对问题“您是否还有其他要分区的驱动器”回答“ n”时。我希望打破所有嵌套循环并继续执行脚本,但是会发生问题,再次询问该问题。
你能帮我解决这个问题吗?
INIT_STARTED=0
chooseDisks()
{
INIT_STARTED=$((INIT_STARTED+1))
# Choosing which drive to work on
read -p "Please type the name of the disk you want to partition: " DISK
while true; do
read -p "Are you sure you want to continue ? y (partition)/n (choose another drive) /x (continue) " ynx
case $ynx in
[Yy]* )
containsElement "$DISK"
if [ $? == 1 ]; then
initializeDisk $DISK
# remove element from found disk to prevent trying to partition it again.
delete=($DISK)
FOUNDDISKS=( "${FOUNDDISKS[@]/$delete}" )
else
echo "${red}$DISK is not a valid choice, please select a valid disk.${reset}"
chooseDisks
fi
break;;
[Nn]* )
chooseDisks
break $((INIT_STARTED));;
[Xx]* )
return
break;;
* ) echo "Please answer y or n. x to continue the script.";;
esac
done
# Any additional disks to partition?
while true; do
read -p "Do you have any additional drives to partition ? y/n " yn
case $yn in
[Yy]* )
#chooseDisks $FOUNDDISKS
chooseDisks
break $((INIT_STARTED));;
[Nn]* )
return
break $((INIT_STARTED));;
* ) echo "Please answer y or n";;
esac
done
}
我希望这样:
break $((INIT_STARTED));;
结束第n个循环并退出函数。
答案 0 :(得分:2)
不要使用嵌套逻辑break
,只需使用$userStop
之类的变量,而不要使用while true; do
put
userStop = false
while[!${userStop}]
do
#...
# replace break $((INIT_STARTED));; by
# userStop = true
答案 1 :(得分:1)
我最终更改了代码,以避免在循环中中断。 谢谢你们指导我正确的方法。
大卫
答案 2 :(得分:0)
我希望打破所有嵌套循环并继续执行脚本
您可以在子shell中运行该函数并使用exit。
chooseDisks()
{
if [ "$1" -eq 0 ]; then
echo "The user entered it all!"
exit 0
fi
echo "The user is still entering... $1"
( chooseDisks $(($1 - 1)) )
}
# Imagine the user 5 times enters something
( chooseDisks 5 )
但是最好的方法是将代码重构为在开始时只有一个大的while true; do
循环。无需使此函数递归。