按空格键继续


73

在用户按下之前,如何停止bash脚本Space

我想在脚本中提出问题

按空格键继续,或按CTRL+ C退出

然后脚本应停止并等待,直到按空格键为止。


所有这些以及更多内容都在本SO Q&A BTW中得到了解决:与DOS暂停等效的Linux是什么?
slm


Answers:


58

您可以使用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

12
您应添加-s,以免在终端上打印出按下的字符。并在末尾添加换行符,否则输出将像问题一样直接在同一行中继续。最好的是:read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
rubo77

1
该脚本不起作用。刚刚在Red Hat Linux上对其进行了测试... else即使按下空格键,该块也始终运行。
罗伯特

3
@robert这是因为您不使用bash。如果您使用read _而不是,则可以使用它代替bash
Niklas Rosencrantz

''内部是否应包含空格?
何塞·安东尼奥·杜拉·奥尔莫斯,2016年

这是''一个空字符串。里面没有空间。我想,如果您输入ENTER或TAB,它也很合适
rubo77'1

44

在本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
rubo77 2014年

2
@ rubo77-啊 这就是使用特殊字符的文字字符串的方式。它的形式为:$ '...'
SLM

1
@ rubo77-有所不同。那是带双引号的美元符号,我用了带单引号的美元符号。请删除该评论,这是错误的。
slm

1
啊我懂了。如果您将转义的序列放在提示字符串中。参见wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
rubo77

@ rubo77-是的,这种表示法允许将转义序列包括在内,而无需任何额外的echo -e "..."行。在这种情况下,它要紧凑得多。
slm

6
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

5

您可以为其创建一个函数:

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

然后,您可以在脚本的任何地方使用它:

pause

如果您不熟悉Shell脚本,则需要在使用脚本之前将函数放在脚本顶部
Richard

3

懒人一班轮:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

缺点是当用户按ctrl + c时您将失去控制。在这种情况下,脚本将始终以代码130退出。


2

设置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

1

这是一种在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大正义中!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.