키를 누를 때 루프 반복을 대화형으로 건너뛰기

키를 누를 때 루프 반복을 대화형으로 건너뛰기

배열을 반복하고 있으며 각 반복마다 프로세스가 다음과 같이 오랫동안 실행됩니다.

!#/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키 입력을 실행하십시오. 키가 이면 변수 [0-9]로 저장하고 ( 2번은 계속해서 2번의 업그레이드를 반복합니다).$skipkill $pidcontinue 2

각 반복에서 $skip변수가 0보다 큰지 확인한 후 1씩 감소시키고 continue다음 반복으로 진행합니다.


노트:

read() 에 대한 시간 제한을 설정해야 한다는 점이 마음에 들지 않습니다 -t 0.1. 어쩌면 누군가가 while프로세스가 sleep 10완료되었을 때 내부 루프를 종료하는 방법을 제안할 수 있습니다 .

관련 정보