Bash脚本听取按键继续前进

时间:2012-03-16 03:08:24

标签: bash shell

所以,我想写一个bash脚本,这是一系列步骤,并将其识别为“task#”。但是,每个步骤都只完成,并且只要用户需要就可以运行。

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
...

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

kev's great solution即使在Bash 3.x中运行良好。,但引入 1秒延迟-t 1)在每次循环迭代中。

Bash 3.x中,-t(超时)支持的最低值1(秒),不幸的是。

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 -rN 1 && [[ $REPLY == 'q' ]] && break

done

# Post-loop command
date +%s

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

jarno求助以下提示:

使用-t 0 ,根据help read(强调添加)按以下方式工作:

  

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

从Bash v4.4.12开始,遗憾的是, -t 0似乎忽略 -n / -N,所以只有 ENTER 按键(或一系列按键 ENTER 结尾)导致read表示数据可用
如果有人知道这是否是 bug 或者是否有充分的理由表明这种行为,请告诉我们。

因此,仅使用 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 && { read -r; break; }

done

# Post-loop command
date +%s