Как циклично выполниться со случаем esac в сценариях оболочки?

Я хотел бы записать сценарий где, если пользователь вводит путь, который содержит его $HOME каталог, это повысило бы ошибку, и сценарий будет работать, пока пользователь не введет допустимый путь, в котором повредится цикл.

По-видимому, это дает синтаксическую ошибку, если я имею continue или break команды. Что я делаю неправильно здесь? Спасибо, Jen.

#!/bin/bash

function project1_install_dir_path() {   

    boolian_2=true; 
    while true; do

    if [ "$boolian_2" = true ] ; then

       read -p "Enter FULL folder path where you want to install colsim1:" fullpath

       echo "you have enterd "$fullpath". Please press 'y' to confirm and 'n' to enter again"

       case "$fullpath" in

       "$HOME"*) echo "Error: The path cannot be in your HOME" ;; continue      
       */home*) echo "Error: The path cannot contain 'home' in the path" ;; continue
       *) echo "you have entered a valid path" ;; break

       esac
       done    
   fi    
}

function main() {

project1_install_dir_path    
}

Терминальный вывод

jen@ss23:/bash_file.sh 
-bash: /project/bash_file.sh: line 62: syntax error near unexpected token `newline'
-bash: /project/bash_file.sh: line 62: ` "$HOME"*) echo "Error: The path cannot be in your HOME" ;; continue  
1
задан 5 April 2019 в 18:03

1 ответ

Необходимо действительно проверить добавление отступа. Финал done и fi операторы находятся в неправильном порядке, хотя Ваше добавление отступа предлагает иначе. Другая проблема case оператор. Базовый синтаксис

case $SOMETHING in
    value1)
        statement1;
        statement2;
        ;;
    value2)
        statement3;
        statement4;
        ;;
esac

Это: финал ;; должен на самом деле быть последний оператор для каждого случая и указывает на его конец. Если Вы хотите continue в некотором случае затем необходимо поместить это continue оператор перед любым ;;, как так:

#!/bin/bash

function project1_install_dir_path() {   

    boolian_2=true; 
    while true; do
        if [ "$boolian_2" = true ] ; then
            read -p "Enter FULL folder path where you want to install colsim1:" fullpath
            echo "you have enterd '$fullpath'. Please press 'y' to confirm and 'n' to enter again"
            case "$fullpath" in
                "$HOME"*) 
                    echo "Error: The path cannot be in your HOME"; 
                    continue;
                    ;;
                */home*)
                    echo "Error: The path cannot contain 'home' in the path";
                    continue;
                    ;;
                *) 
                    echo "you have entered a valid path";
                    break;
                    ;;
            esac
        fi    
    done    
}

function main() {
    project1_install_dir_path    
}

main;
2
ответ дан 7 December 2019 в 13:18

Другие вопросы по тегам:

Похожие вопросы: