bash - если код возврата> = 1, повторно запустить скрипт, начать с начала - PullRequest
4 голосов
/ 31 октября 2011

У меня есть скрипт bash, который печатает заголовок и проверяет значение «Y» или «N».

Когда кто-то вводит текст, который не равен «Y» или «N», я хотел бы отправить его обратно в начало сценария, чтобы он снова печатал заголовок и вопрос.

Я знаю, что вы можете сделать это с помощью goto, но мне было интересно, есть ли другой способ, потому что я слышу, как многие люди говорят, что вы не должны использовать goto или что он устарел. Правда это или нет, я хотел бы посмотреть, есть ли у кого-нибудь еще способ решить эту проблему.

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 31 октября 2011

Вы можете реализовать это в цикле:

while [ !$exit_loop ]
do
    echo "enter choice - "
    read -n 1 input
    case "$input" in
     y|Y) $exit_loop = 1;;
     n|N) $exit_loop = 1;;
     *) echo "invalid choice";;
    esac
done

Лично я не вижу разницы между использованием goto / loop или любым другим способом. Я бы всегда говорил использовать то, что наиболее подходит для ситуации - для вас я бы использовал goto.

например. Если у вас есть несколько отступов, охватывающих много строк, и вам нужно вернуться к началу функции, я бы использовал goto - это намного легче понять в ее контексте.

2 голосов
/ 28 января 2015

В качестве прямого ответа на ваш вопрос вы можете использовать exec для замены текущего процесса другим процессом или, в зависимости от обстоятельств, другой свежей копией текущего процесса.

read -p "Yes? Or no? " yn
case $yn in
  [YyNn]) ;;
  *) exec "$0" "$@"
esac
2 голосов
/ 31 октября 2011

Если вы хотите более структурированный подход, вы можете использовать в течение или до цикла .

1 голос
/ 31 октября 2011

Пример (слегка упрощенный) с использованием предложения @ Майкла. Условие выхода находится в цикле while, но пользователь также может выполнить промежуточное действие, чтобы решить, какое действие предпринять:

while [[ ! "${action-}" =~ ^[SsRr]$ ]]
do
    echo "What do you want to do?"
    read -n 1 -p $'[d]iff, [s]kip, [S]kip all, [r]eplace, [R]eplace all: \n' action

    if [[ "${action-}" =~ ^[Dd]$ ]]
    then
        diff "$target_path" "$source_path"
    fi
done
0 голосов
/ 28 января 2015
echo "Hello User, are you ready to learn some Linux?"
while true; do
    echo "Please enter y/n:"
    read a
    bfunc() {
        if [ "$a" == "y" ]
        then
            echo "That is great, lets get started!"
            echo "This Script is under construction, functionality coming soon"
            exit 0
        elif [ "$a" == "n" ]
        then
            echo "That is too bad, see you next time!"
            echo "You are now exiting the script"
            exit 0
        else [ "$a" != "y||n" ]
            echo "Please only enter y or n!" 
        fi
    }
    bfunc
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...