#linux #bash
#linux #bash
Вопрос:
У меня есть следующий код для циклического выполнения сеанса вопросов с пользователем:
#loop counter
COUNTER=1
# Initial question
echo ""
echo -n "Would you like a cup of tea? (y/n)" # Ask initial question
read answer # Check answer
while [ $COUNTER -le 5 ] # while counter is less than or equal to 5
do
if [ "$answer" != "${answer#[Yy]}" ]; then # if answer is 'y'
echo "" # skip a line for cleanliness
echo "Great, I'll make it now" # Satisfaction
echo ""
break # End the loop
else # if answer is anything other than 'y'
echo "" # skip a line for cleanliness
echo -n "Are you sure? (y/n)" # Ask again
read answer # Check the answer again
let COUNTER=COUNTER 1 # increment COUNTER
fi
done # finish
Код должен действовать следующим образом:
- Спросите пользователя, не хотят ли они чая.
- Если пользователь говорит «да», тогда распечатайте что-нибудь и завершите цикл
- Если пользователь говорит «нет», сделайте еще 4 попытки перед завершением цикла.
- Если пользователь говорит «да», сказав «нет», распечатайте что-нибудь и завершите цикл.
Код отлично работает для пунктов 1,2 и 4. В пункте 3 — код переходит к 5-му циклу перед завершением.
Кажется, я не могу определить ошибку.
Редактировать: Изменено на COUNTER = 0, а $COUNTER -файл 4. Однако код не реализует пункт 4 с 4-й попытки (т. Е. 1 начальное «нет», за которым следуют 3 дополнительных «нет» перед «да»).
Комментарии:
1. Изменение
while [ $COUNTER -le 5 ]
наwhile [ $COUNTER -le 4 ]
устранило проблему по крайней мере для меня.2. … или
[ $COUNTER -lt 5 ]
(«меньше» против «меньше или равно»).3. Если вы собираетесь использовать bashisms, такие как
echo -n
иlet
, вы также можете использовать те, которые также упростят ваш код, такие какfor ((counter=1; counter < 5; counter )); do
иif [[ $answer = [Yy]* ]]
.
Ответ №1:
Вы могли бы просто ограничить счетчик меньше 5, вместо меньше или равно .
Используйте -lt
вместо -le
. Это [ $COUNTER -lt 5]
или
Вы можете сказать меньше или равно 4 и, таким образом, вы можете поддерживать [ $COUNTER -le 4]
Комментарии:
1. предлагаемое решение основано на счетчике, начинающемся с 1, но если он инициализирован в 0, то он должен быть установлен на меньшее или равное 3 (
-le 3
), чтобы он выполнялся через 0,1,2,3 (4 шага), или его можно поддерживать равным-lt 4
Ответ №2:
Вместо того, чтобы иметь 2 строки,
echo -n "Are you sure? (y/n)" # Ask again
read answer # Check the answer again
вы можете сократить его до одного:
read -p "Are you sure? (y/n): " answer
Однако я не совсем уверен, что вы подразумеваете под пунктом 4. Не могли бы вы привести пример или немного больше описания?