При переходе к дополнительному циклу

#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
  

Код должен действовать следующим образом:

  1. Спросите пользователя, не хотят ли они чая.
  2. Если пользователь говорит «да», тогда распечатайте что-нибудь и завершите цикл
  3. Если пользователь говорит «нет», сделайте еще 4 попытки перед завершением цикла.
  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. Не могли бы вы привести пример или немного больше описания?