我正在循环一个数组,并且对于每次迭代,在过程中运行很长时间,如下所示:
!#/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
完成时终止内部循环。