,然后脚本应停止并等待直到按下空格键。
#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 楼
这是在bash
和zsh
中都可以使用并确保对终端的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
评论
所有这些以及更多内容都在本SO Q&A BTW中得到了解决:与DOS暂停等效的Linux是什么?另请参阅:暂停Shell脚本,直到在while循环中按Enter键
相关:unix.stackexchange.com/questions/293940/…