Я пытался написать скрипт, который будет спрашивать пользователя, должен ли он/она выполнить команду снова.
Если ответ положительный, то он должен выполнить последнюю команду снова. Даже после второго выполнения он должен спросить пользователя, следует ли ему выполнить последнюю команду или нет. Я хочу, чтобы это происходило до тех пор, пока ответ не станет отрицательным, если ответ отрицательный, то он должен выйти.
т.е.
$ 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 и выполнять), пока ответ не станет "да". если "нет", то он должен выйти.
Я думаю, что мне нужно реализовать какой-то цикл, но я запутался, так как это условный скрипт.
Использование bash:
while [[ "$REPLY" != "no" ]]
do
echo foo
read -p "Can I run the last command (yes/no)?"
done
Это требует буквального ответа «нет», чтобы выйти из цикла, поэтому я немного расшифровал подсказку «да/нет».
bash read
позволяет пользовательское приглашение (-p
и строку, следующую за ), и сохраняет ответ пользователя в переменной $REPLY, которая, как я предполагаю, не является «нет» перед входом в цикл (пусто, если у вас еще ничего read
нет ).
Альтернатива ответу Джеффа:
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
дополнительно вырвется из цикла команд.