Jarrod A.
Jarrod A.

Reputation: 93

Bash: While loop error

I'm trying to write a program where the program will ask you your name, confirm that you want this name, then check to see if you said yes or no. I have the "no" loop working, where it will ask for a name again, but I'm trying to a loop where if you type anything other than yes or no it will say "Please type yes or no." then ask if you want to confirm your name, then check the answer again. Heres what I have.

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."

If I go through the "Please type yes or no." it will freeze at the sleep and not clear, therefore not displaying the echo and continuing the loop. Any help or suggestions would be greatly appreciated!

Upvotes: 1

Views: 42

Answers (2)

glenn jackman
glenn jackman

Reputation: 247102

An easier way to write a loop to get user's input is the select command:

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."

Upvotes: 0

choroba
choroba

Reputation: 242123

Here's the problem:

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

Every possible answer is different to at least one of them. There's no string that's equal to yes and no at the same time. You need && instead of ||.

Upvotes: 2

Related Questions