Выполнять предыдущую команду до тех пор, пока ответ не будет отрицательным [условный сценарий]

Я пытался написать скрипт, который будет спрашивать пользователя, должен ли он/она выполнить команду снова.

Если ответ положительный, то он должен выполнить последнюю команду снова. Даже после второго выполнения он должен спросить пользователя, следует ли ему выполнить последнюю команду или нет. Я хочу, чтобы это происходило до тех пор, пока ответ не станет отрицательным, если ответ отрицательный, то он должен выйти.

т.е.

$ cat shellscript.sh
  echo foo
  printf 'Can I run the last command (y/n)?' 

Если мой ответ "да", то он должен выполнить команду "echo foo"

  # after the 1st time execution
  printf 'Can I run the last command again (y/n)?'

Он выполнит команду снова, если ответ "да", он будет делать то же самое (спрашивать y/n и выполнять), пока ответ не станет "да". если "нет", то он должен выйти.

Я думаю, что мне нужно реализовать какой-то цикл, но я запутался, так как это условный скрипт.

0
12.04.2018, 15:38
2 ответа

Использование bash:

while [[ "$REPLY" != "no" ]]
do
  echo foo
  read -p "Can I run the last command (yes/no)?"
done

Это требует буквального ответа «нет», чтобы выйти из цикла, поэтому я немного расшифровал подсказку «да/нет».

bash readпозволяет пользовательское приглашение (-pи строку, следующую за ), и сохраняет ответ пользователя в переменной $REPLY, которая, как я предполагаю, не является «нет» перед входом в цикл (пусто, если у вас еще ничего readнет ).

1
28.01.2020, 02:43

Альтернатива ответу Джеффа:

while true; do
    somecommand

    while true; do
        read -p 'Can I run the last command again (yes/no)? '

        case "$REPLY" in
            [Yy]*) break   ;;
            [Nn]*) break 2 ;;
            *) echo 'Sorry, what?' >&2
        esac
    done
done

Основное отличие состоит в том, что мы настаиваем на получении действительного ответа от пользователя. Допустимым ответом является любая строка, начинающаяся с yилиn(без учета регистра ).

breakвырвется из цикла чтения ответа -, а break 2дополнительно вырвется из цикла команд.

0
28.01.2020, 02:43

Теги

Похожие вопросы