按键时交互式地跳过循环迭代

按键时交互式地跳过循环迭代

我正在循环一个数组,并且对于每次迭代,在过程中运行很长时间,如下所示:

!#/bin/bash
arr=({1..100})
for i in "${arr[@]}"; do
   echo "$i"
   sleep 10
done

现在我希望能够按数字键 0-9 来终止当前进程,继续并跳过此次数的迭代。

我怎样才能做到这一点?

答案1

我想出了这个解决方案:

#!/bin/bash

# set array
arr=({1..100})

# initialize skip variable
skip=0

for i in "${arr[@]}"; do

    # skip
    if [ $skip -gt 0 ]; then
        printf 'skipping %s\n' "$i"
        skip=$((skip-1))
        continue
    fi

    # run my process
    echo "$i"
    sleep 10 &
    pid=$!

    # wait for keystroke
    while [ -d /proc/$pid ]; do
        read -rsn1 -t0.1 k
        case "$k" in
            [0-9])
                skip=$k
                kill $pid &>/dev/null
                continue 2
                ;;
        esac
    done
done

基本上,我将进程发送到后台并保存它的 pid。

然后运行一个循环while $pid存在并read击键。如果 key 是[0-9],则将其保存为$skip变量,kill $pid并且continue 2(2 继续循环 2 升级)。

在每次迭代中,检查$skip变量是否大于 0,然后减一并continue进行下一次迭代。


笔记:

read我对为( )设置超时的需要不太满意-t 0.1。也许有人可以建议如何while在进程sleep 10完成时终止内部循环。

相关内容