Как сделать цикл while из 2 условий и остановиться в истинном состоянии? - PullRequest
0 голосов
/ 04 мая 2019

Я хочу создать цикл while, который запрашивает пользовательский ввод для да или нет, если пользователь вводит что-то еще, он будет зацикливаться, пока пользователь не введет либо да, либо нет

echo "Do you wish to save these settings?"
read response
while [ "$response" != "yes" ] | [ "$response != "no" ] 
do
   echo "Please enter yes or no only"
   echo "Do you wish to save these settings?"
   read response 
done

когда я пытался ввести да, он все еще продолжает цикл, но когда я ввожу нет, он выходит из цикла

Ответы [ 2 ]

1 голос
/ 04 мая 2019

В оболочке оператор | (или pipe ) используется для фильтрации вывода команды слева с помощью команды справа.

Например,следующая строка оболочки:

seq 1 3 | tac

... приведет к строкам, полученным командой слева ...

1
2
3

...быть отфильтрованным по команде слева (которая испустит строки в обратном порядке).Вывод будет:

3
2
1

Вы после оператора, который выполняет логическую операцию над состояниями выхода двух команд.Поскольку вы хотите продолжить цикл до тех пор, пока ответ не будет yes или no, оператор соединения (&&) - это то, что вам нужно:

echo "Do you wish to save these settings?"
read response
while [ "$response" != "yes" ] && [ "$response" != "no" ] 
do
   echo "Please enter yes or no only"
   echo "Do you wish to save these settings?"
   read response 
done

ЕслиОболочка bash всегда будет доступна везде, где вы запускаете скрипт, это можно улучшить, используя [[ ... ]] вместо [ ... ].Помимо потенциального выигрыша в производительности, еще одним преимуществом использования [[ является то, что требования строгого цитирования смягчены:

echo "Do you wish to save these settings?"
read response
while [[ $response != yes ]] && [[ $response != no ]] 
do
   echo "Please enter yes or no only"
   echo "Do you wish to save these settings?"
   read response 
done

Дальнейшее улучшение происходит от знания того, что [[ поддерживает && для соединения двухлогические выражения:

echo "Do you wish to save these settings?"
read response
while [[ $response != yes && $response != no ]] 
do
   echo "Please enter yes or no only"
   echo "Do you wish to save these settings?"
   read response 
done
0 голосов
/ 04 мая 2019

Просто while true все это пока не удовлетворено:

while true
do
    echo "Do you wish to save these settings?"
    read response
    if [[ "$response" = "yes" ]] || [[ "$response" = "no" ]]
    then
        break
    fi
    echo "Please enter yes or no only"
done
...