所以,我想写一个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,然而,我想继续下一件事
答案 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