Bash脚本听取按键继续前进

Cri*_*pto 15 bash shell

所以,我想编写一个bash脚本,这是一系列步骤,并将其识别为"任务#".但是,每个步骤仅完成,并且只要用户需要就可以运行.

Do task1
if keypressed stop task1 and move on #this is the part I need help with. There can be up to 10 of these move on steps. 
Do task2
...
Run Code Online (Sandbox Code Playgroud)

kina喜欢上衣; 它一直在做东西,直到你完全达到q,然而,我想继续下一件事

kev*_*kev 16

您可以使用read内置的命令选项-t-n

while :
do
    # TASK 1
    date
    read -t 1 -n 1 key

    if [[ $key = q ]]
    then
        break
    fi
done

# TASK 2
date +%s
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 6

kev 的出色解决方案即使在 Bash 3.x 中也能正常工作。,但它引入了1 秒的延迟-t 1 )。

在Bash 3.x 中, (超时)支持的最低值为(秒)-t1

Bash 4.x 支持0数值

支持任意键的解决方案(例如q需要一个非零 -t值),但您可以指定一个非常接近的值0以最小化延迟

#!/bin/bash
# !! BASH 4.x+ ONLY

while :; do

  # Loop command
  date

  # Check for 'q' keypress *waiting very briefly*  and exit the loop, if found.
  read -t 0.01 -r -s -N 1 && [[ $REPLY == 'q' ]] && break

done

# Post-loop command
date +%s
Run Code Online (Sandbox Code Playgroud)

注意:上面的值用作0.01几乎无超时值,但是,根据您的主机平台、终端程序以及可能的 CPU 速度/配置,可能需要更大的值/可能支持更小的值。如果值太小,您会看到间歇性error setting terminal attributes: Interrupted system call错误- 如果有人知道原因,请告诉我们。


向亚诺致敬,感谢他在以下方面的帮助:

-t 0根据help read(添加强调) ,使用, 的工作原理如下:

如果 TIMEOUT 为 0,则 read立即返回,而不尝试读取任何数据,仅当指定文件描述符上的输入可用时才返回成功。

不幸的是,从 Bash v4.4.12 和 5.0.11 开始-t 0似乎忽略了 -n/ -N,因此只有一个按键(或以 结尾的ENTER一系列按键)会导致指示 data is available ENTERread
如果有人知道这是否是一个错误或者这种行为是否有充分的理由,请告诉我们。

因此,目前只能ENTER作为退出键的-t 0解决方案:

#!/bin/bash
# !! BASH 4.x+ ONLY

while :; do

  # Loop command
  date

  # Check for ENTER keypress and, after clearing the input buffer
  # with a dummy `read`, exit the loop.
  read -t 0 -r -N 1 && { read -r; break; }

done

# Post-loop command
date +%s
Run Code Online (Sandbox Code Playgroud)