Bash 按任意键可在5秒内中止

Bash 按任意键可在5秒内中止,bash,user-input,Bash,User Input,嗨,我正在尝试实现一个事件,该事件将在5秒倒计时后发生,除非按下一个键。我一直在使用此代码,但如果按enter或空格键,它将失败。如果回车或空格被检测为“”,则它将失败 看完这篇文章,, 我放弃了,贴在这里。我觉得一定有比我尝试实现的更好的方法。中的涵盖了问题的“检测输入”部分。您可以从read查看退出代码 关于处理空间,有两个答案 空格的问题是,在正常情况下,read在将输入分配给给定变量时,会修剪输入的前导和尾随空格(word会分割输入) 有两种方法可以避免这种情况 您可以避免使用自定义命

嗨,我正在尝试实现一个事件,该事件将在5秒倒计时后发生,除非按下一个键。我一直在使用此代码,但如果按enter或空格键,它将失败。如果回车或空格被检测为“”,则它将失败

看完这篇文章,,

我放弃了,贴在这里。我觉得一定有比我尝试实现的更好的方法。

中的涵盖了问题的“检测
输入
”部分。您可以从
read
查看退出代码

关于处理空间,有两个答案

空格的问题是,在正常情况下,
read
在将输入分配给给定变量时,会修剪输入的前导和尾随空格(word会分割输入)

有两种方法可以避免这种情况

  • 您可以避免使用自定义命名变量,而是使用
    $REPLY
    。当分配给
    $REPLY
    时,不会执行空格修剪或分词。(虽然我刚刚在POSIX规范中找不到它,所以这可能是某种非标准和/或不可移植的扩展。)

  • 对于
    read
    命令,显式地将
    IFS
    设置为空字符串,这样它就不会执行空格修剪或分词

    $ 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
    
    $IFS=read-r-s-n1-t5-p“在接下来的5秒内按任意键中止”;回声$?
    #压榨
    0
    $declare-p密钥
    声明--k=“”
    $unset-VK
    $IFS=read-r-s-n1-t5-p“按任意键在接下来的5秒内中止。”键;回声$?
    #等等
    1.
    $declare-p密钥
    -bash:declare:k:未找到
    

  • 阅读
    手册说明:

    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
    
    参考资料:
    注意:
    引文中的重点是我的。

    如果在键的顶部设置一个虚拟值,即
    key=nones此类
    ,会发生什么?祝你好运,这真是个好主意。谢谢这种方式看起来非常优雅,而这就是我最后做这件事的方式。非常感谢您的回复。
    #!/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