Прерывание вложенных циклов функций в Bash - PullRequest
0 голосов
/ 13 мая 2019

Я использую вложенную функцию для разбиения и создания файловой системы для дисков, подключенных к новой коробке 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 ]

2 голосов
/ 13 мая 2019

Не играйте с вложенной логикой break, просто используйте переменную типа $userStop и вместо while true; do поставьте

userStop = false
while[!${userStop}]
do
#...
# replace break $((INIT_STARTED));; by
# userStop = true
1 голос
/ 17 мая 2019

Я закончил тем, что изменил код, чтобы избежать разрыва в цикле. Спасибо, ребята, за правильное направление.

David

0 голосов
/ 17 мая 2019

Я ожидаю разорвать все вложенные циклы и продолжить выполнение сценария

Вы можете запустить функцию в подоболочке и использовать команду 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.Нет необходимости делать эту функцию рекурсивной.

...