2015-03-14 2 views
0

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

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

clear 
confirm() { 
    # call with a prompt string or use a default 
    echo "CMIT # ${1}" 
    read -r -p "CMIT [Y/n/q] > " answer 
    case "${answer}" in 
     [yY]|[yY][eE][sS]) false ;; 
     [nN]|[nN][oO]) true ;; 
     [qQ]|[qQ][uU][iI][tT]) exit 1 ;; 
    esac 
} 

while true; do 
    OE_USER= 
    while (id -u $OE_USER > /dev/null 2>&1); do 
     echo "CMIT # What user will this run under?" 
     read -r -p "CMIT > " OE_USER 
     if id -u $OE_USER > /dev/null 2>&1; then 
      echo "CMIT # Bad User Name. Try Again" 
     fi 
    done 
    clear 
    confirm "Continue installing using '$OE_USER' as the server name?" 
done 
+0

Ваш внешний цикл while никогда не сломается. В цикле нет инструкции break, а условный цикл - просто «истина». Я думаю, вам может понадобиться условие, чтобы проверить результат вызова 'confirm'? Затем вы можете изменить 'истину' на' $? ', Но просто убедитесь, что' $? 'Равно true, входя в цикл, поэтому добавьте вызов' true' непосредственно перед внешним циклом while. – bgoldst

+0

@bgoldst Спасибо. Я заметил, что сразу после того, как я опубликовал это. все еще не могу поверить, что это было настолько очевидно. –

ответ

0

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

Есть и другие варианты, такие как использование рекурсивного вызова после тестирования пользовательского ввода. Это отрицает необходимость цикла while, но создаст необходимость сделать ваш начальный вход функцией.

0

Wow. Глупый вопрос. Сожалею.

clear 
GO=true 
confirm() { 
    # call with a prompt string or use a default 
    echo "CMIT # ${1}" 
    read -r -p "CMIT [Y/n/q] > " answer 
    case "${answer}" in 
     [yY]|[yY][eE][sS]) GO=false ;; 
     [nN]|[nN][oO]) GO=true ;; 
     [qQ]|[qQ][uU][iI][tT]) exit 1 ;; 
    esac 
} 

while $GO; do 
    OE_USER= 
    while (id -u $OE_USER > /dev/null 2>&1); do 
     echo "CMIT # What user will this run under?" 
     read -r -p "CMIT > " OE_USER 
     if id -u $OE_USER > /dev/null 2>&1; then 
      echo "CMIT # Bad User Name. Try Again" 
     fi 
    done 
    clear 
    confirm "Continue installing using '$OE_USER' as the server name?" 
done 
GO=true 
0

Вы можете использовать статус выхода вашей функции:

Изменить «да» дело выполнить «истинный», и «нет» случая, чтобы выполнить «ложь». Затем

while true; do 
    # ... 
    if confirm "Continue installing using '$OE_USER' as the server name?" 
    then 
     break 
    fi 
done 
Смежные вопросы