您好我试图实施一个在5秒倒计时后发生的事件,除非按下某个键。我一直在使用这段代码,但是如果按下回车键或空格键就会失败。它在输入或空间被检测为""。
的意义上失败了echo "Phoning home..."
key=""
read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key
echo
if [ "$key" = "" ] # No Keypress detected, phone home.
then python /home/myuser/bin/phonehome.py
else echo "Aborting."
fi
阅读这篇文章后, Bash: Check if enter was pressed
我放弃了,发布在这里。我觉得必须有比我试图实施的更好的方式。
答案 0 :(得分:4)
read
手册说:
read
的返回码为零,除非遇到文件结尾 或读出超时。
在您的情况下,当用户在允许的时间内点击任何键时,您希望中止继续。
#!/bin/bash
if read -r -s -n 1 -t 5 -p "TEST:" key #key in a sense has no use at all
then
echo "aborted"
else
echo "continued"
fi
<强>参考:强>
Read Manual
注意:强>
引文的重点是我的。
答案 1 :(得分:2)
accepted answer中的linked question涵盖问题的“检测enter
”组件。您可以查看read
的退出代码。
关于处理空间,有两个答案。
空间问题是在正常情况下read
在将输入分配给给定变量时修剪输入的前导和尾随空格(以及对输入进行分词)。
有两种方法可以避免这种情况。
您可以避免使用自定义命名变量,而是使用$REPLY
。分配给$REPLY
时,不执行空格修剪或分词。 (虽然现在正在寻找这个我在POSIX规范中实际上找不到这个,所以这可能是某种非标准和/或非便携式扩展。)
将IFS
显式设置为read
命令的空字符串,使其不执行并进行空格修剪或分词。
$ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $?
# Press <space>
0
$ declare -p key
declare -- k=" "
$ unset -v k
$ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $?
# Wait
1
$ declare -p key
-bash: declare: k: not found