在用户按下之前,如何停止bash脚本Space?
我想在脚本中提出问题
按空格键继续,或按CTRL+ C退出
然后脚本应停止并等待,直到按空格键为止。
所有这些以及更多内容都在本SO Q&A BTW中得到了解决:与DOS暂停等效的Linux是什么?
—
slm
在用户按下之前,如何停止bash脚本Space?
我想在脚本中提出问题
按空格键继续,或按CTRL+ C退出
然后脚本应停止并等待,直到按空格键为止。
Answers:
您可以使用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
是您在执行BAT文件时在Windows上习惯的行为的替代方法的最佳选择。
$ 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
设置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
并确保对终端进行I / O的方法:
# 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
大正义中!