0
#!/bin/bash
CHECKUSER=$(grep "$USER" /var/log/string.log)
if [[ $CHECKUSER == "" ]];
   then
        echo  "Please enter y or n? (y/n)?"
        read string
        if [ "$string" = "y" -o "$string" = "n" ];
           then
              {
              echo "$USER - $string" >> /var/log/string.log
              }
           else
              while [ "$string" != "y" -o "$string" != "n" ];
                 do
                 echo "'$string' is an invalid option, please enter y or n: "
                 read string
              done
        fi
elif [[ $CHECKUSER == "$USER - n" ]];
   then
        echo "User selected n"
elif [[ $CHECKUSER == "$USER - y" ]];
   then
        echo "You've already said that you would like your account backed up."
else echo "User entered something other than y or n"
fi

これはすべてうまくいきます!しかし、y|n 以外を入力すると、無限ループに陥ります。

何か案は?

4

2 に答える 2

4

あなたは変わらなければならない

while [ "$string" != "y" -o "$string" != "n" ];

while [ "$string" != "y" -a "$string" != "n" ];

それ以外の場合は常に真であるため:

if string="y" ----------> [ false -o true  ] == [ true ]
if string="n" ----------> [ true  -o false ] == [ true ]
if string="whatever" ---> [ true  -o true  ] == [ true ]
于 2013-04-04T15:06:34.763 に答える
2

この while ループには 2 つの問題があります。

while [ "$string" != "y" -o "$string" != "n" ];
do
    echo "'$string' is an invalid option, please enter y or n: "
    read backup
done

fedorqui が指摘したように、テストは常に true ですが、それを修正しても、stringではなくバックアップを読み取っているため、ループすることになります。次のように変更します。

while [ "$string" != "y" -a "$string" != "n" ];
do
    echo "'$string' is an invalid option, please enter y or n: "
    read string
done
于 2013-04-04T16:25:14.113 に答える