突破Bash中的嵌套函数循环

时间:2019-05-13 14:38:27

标签: linux bash redhat

我正在使用嵌套函数对连接到新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个循环并退出函数。

3 个答案:

答案 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循环。无需使此函数递归。