2015-10-01 2 views
1

Я пытаюсь написать программу, в которой программа запросит у вас свое имя, подтвердите, что вы хотите это имя, а затем проверьте, не сказали ли вы да или нет. У меня есть цикл «no», где он будет запрашивать имя снова, но я пытаюсь создать цикл, в котором, если вы введете что-либо другое, кроме да или нет, оно скажет: «Пожалуйста, введите« да »или« нет ». затем спросите, хотите ли вы подтвердить свое имя, а затем снова проверьте ответ. Вот что у меня есть.Bash: while ошибка цикла

echo -e $WHITE"Name your$GREEN Hero$WHITE." 
read HERO 
clear 
echo -e "Are you sure you want your$GREEN Hero$WHITE's name to be$GREEN "$HERO"$WHITE? y/n" 
read ANSWER1 
while [ $ANSWER1 = "no" ]; do 
# 
# 
# 
clear 
echo -e $WHITE"Name your$GREEN Hero$WHITE." 
read HERO 
clear 
echo -e "Are you sure you want your$GREEN Hero$WHITE's name to be$GREEN "$HERO"$WHITE? y/n" 
read ANSWER1 
done 
    while [ $ANSWER1 != "yes" ] || [ $ANSWER1 != "no" ]; do 
# 
# 
# 
    clear 
    echo -e $WHITE"Please type yes or no." 
    sleep 1.5 
    clear 
    echo -e $WHITE"Are you sure you want your$GREEN Hero$WHITE's name to be$GREEN "$HERO"$WHITE?" 
    read ANSWER1 
    clear 
    done 
clear 
echo -e -n $WHITE"Loading" 
sleep 1.5 
echo -e -n "." 
sleep 1.5 
echo -e -n "." 
sleep 1.5 
echo -e -n "." 
sleep 1.5 
clear 
echo -e "Done." 

Если я пройду через «Пожалуйста, введите« да »или« нет ». он замерзнет во сне и не станет ясным, поэтому не будет отображать эхо и продолжить цикл. Любая помощь или предложения будут очень признательны!

+1

выйти из привычки использовать ALL_CAPS_VARNAMES. Однажды вы [случайно используете 'PATH = ...'] (http://stackoverflow.com/questions/28310594/ls-not-found-after-running-read-path) и задаетесь вопросом, почему ваш скрипт сломался. –

ответ

2

Вот проблема:

while [ $ANSWER1 != "yes" ] || [ $ANSWER1 != "no" ]; do 

Каждый возможный ответ отличается, по крайней мере, один из них. Нет ни одной строки, которая равна yes и no в то же время. Вам нужно && вместо ||.

0

Простой способом, чтобы написать цикл, чтобы получить ввод пользователя является select командой:

while true; do 
    read -p "${white}Name your ${green}Hero$white: " hero 

    echo "Are you sure you want your ${green}Hero$white's name to be $green\"$hero\"$white? " 
    select ans in Yes No; do 
     case $ans in 
      Yes) break 2 ;; # break out of both select and while loops 
      No) break ;; # only break out of select loop 
     esac 
    done 
done 

echo "Your ${green}Hero$white's name is $green\"$hero\"$white." 
Смежные вопросы