如何停止bash脚本,直到用户按下空格键? + C退出


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

评论

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

另请参阅:暂停Shell脚本,直到在while循环中按Enter键

相关:unix.stackexchange.com/questions/293940/…

#1 楼

您可以使用read
read -n1 -s -r -p $'Press space to continue...\n' 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

用上面的空格替换' ',用Enter键输入'',Tab键输入$'\t'

评论


您应该添加-s,以免在终端上打印出按下的字符。并在末尾添加一个换行符,否则输出将像问题一样直接在同一行中继续。最好是:读取-n1 -rsp $'按任意键继续,或按Ctrl + C退出... \ n'

–rubo77
14年6月22日在9:24

该脚本不起作用。刚刚在Red Hat Linux上进行了测试... else块始终运行,即使按下空格键也是如此。

–robert
15/12/22在6:56



@robert这是因为您不使用bash。如果您使用read _而不是bash以外的其他shell,则它可以工作。

–尼古拉斯·R。
16年5月2日在9:48



内是否应包含空格?

–匿名An夫
16年11月29日在10:37

这是从STDIN读取的,这将给管道带来问题。 script.sh请参阅此答案以获取解决方案。

–汤姆·黑尔
18年6月28日在5:25

#2 楼

在本SO Q&A中讨论的方法可能是您在执行BAT文件时在Windows上习惯于pause行为的替代方法的最佳候选方法。



在这里,我运行上面的命令,然后简单地按任意键,在这种情况下,请按D键。

相当于DOS暂停的linux是什么?


评论


我的意思是为什么在字符串之前的$:-rsp $'Press?

–rubo77
2014年6月4日22:44



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

–slm♦
2014年6月5日下午0:38

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

–slm♦
14-6-5在7:37



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

–rubo77
2014年6月5日7:57

@ rubo77-是的,该表示法允许不包含任何额外回显-e“ ...”行的转义序列。在这种情况下,它要紧凑得多。

–slm♦
2014年6月5日在7:58

#3 楼

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

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


然后可以在脚本中的任何地方使用此函数:

pause


评论


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

–理查德
16年3月24日在16:54

#4 楼

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进行测试,不进行[测试,也不进行]测试,例如:

sed -n q </dev/tty


评论


最后两个解决方案似乎也可以与/ bin / sh一起使用(例如,在FreeBSD上),不仅适用于bash。

– zezollo
20年6月10日在15:24

您对SO的回答是否相等,甚至更好?

– zezollo
20年6月10日在15:32

#5 楼

这是在bashzsh中都可以使用并确保对终端的I / O的一种方法:

#6 楼

懒惰的一个衬纸:

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


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

#7 楼

IFS设置为空字符串会抑制read修剪空白的默认行为。无需分词:

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


#8 楼

这是按Press SPACE继续操作(而不是ENTER)的简单解决方案。是的,只有空格键,按回车键不会中断。