В оболочке оператор |
(или 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