所以,我想编写一个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)
kev 的出色解决方案即使在 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 -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)