Как остановить скрипт bash, пока пользователь не нажал Space?
Я хотел бы иметь вопрос в моем сценарии
Нажмите пробел, чтобы продолжить, или CTRL+, Cчтобы выйти
и затем скрипт должен остановиться и ждать, пока не будет нажата клавиша пробела.
Как остановить скрипт bash, пока пользователь не нажал Space?
Я хотел бы иметь вопрос в моем сценарии
Нажмите пробел, чтобы продолжить, или CTRL+, Cчтобы выйти
и затем скрипт должен остановиться и ждать, пока не будет нажата клавиша пробела.
Ответы:
Вы можете использовать read
:
read -n1 -r -p "Press space to continue..." key
if [ "$key" = '' ]; then
# Space pressed, do something
# echo [$key] is empty when SPACE is pressed # uncomment to trace
else
# Anything else pressed, do whatever else.
# echo [$key] not empty
fi
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
Блок всегда работает, даже когда нажата пробел.
bash
. Это работает, если вы используете read _
вместо этого, если у вас есть другая оболочка, чем bash
.
''
содержать пробел внутри?
''
для пустой строки. Нет места внутри. Я думаю, это также подходит, если вы введете ENTER или TAB
Метод, обсуждаемый в этом SO Q & A, вероятно, является лучшим кандидатом на альтернативу pause
поведению, которое вы привыкли в Windows при работе с файлами BAT.
$ read -rsp $'Press any key to continue...\n' -n1 key
Здесь я запускаю вышеизложенное, а затем просто нажимаю любую клавишу, в данном случае Dклавишу.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$
перед строкой здесь -rsp $'Press
:?
echo -e "..."
строк. В таких ситуациях он намного компактнее.
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"
Теперь он печатает подсказку без завершающего символа новой строки, CTRL+C
надежно обрабатывает , вызывает stty
только столько раз, сколько необходимо, и восстанавливает контрольный tty до того состояния, в котором stty
он находился . Посмотрите на man stty
информацию о том, как явно контролировать эхо, символы управления и все.
Вы также можете сделать это:
printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty
Вы могли бы сделать это ENTER
без [
тестов ]
и ничего stty
подобного:
sed -n q </dev/tty
Вы можете создать для него функцию:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
Тогда вы можете использовать это везде в вашем скрипте:
pause
Настройки IFS
для пустой строки подавляют поведение чтения по умолчанию обрезки пробела.
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
# Set IFS to empty string so that read doesn't trim
# See http://mywiki.wooledge.org/BashFAQ/001#Trimming
IFS= read -n1 -r key
[[ $key == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
ОБНОВЛЕНИЕ 2018-05-23: мы можем упростить это, используя переменную REPLY, которая не разделяется на слова:
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
read -n1 -r
[[ $REPLY == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
Вот способ, который работает как bash
и zsh
, и обеспечивает ввод / вывод в терминал:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
Поместите это .{ba,z}shrc
для Великой Справедливости!