배열을 반복하고 있으며 각 반복마다 프로세스가 다음과 같이 오랫동안 실행됩니다.
!#/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번의 업그레이드를 반복합니다).$skip
kill $pid
continue 2
각 반복에서 $skip
변수가 0보다 큰지 확인한 후 1씩 감소시키고 continue
다음 반복으로 진행합니다.
노트:
read
() 에 대한 시간 제한을 설정해야 한다는 점이 마음에 들지 않습니다 -t 0.1
. 어쩌면 누군가가 while
프로세스가 sleep 10
완료되었을 때 내부 루프를 종료하는 방법을 제안할 수 있습니다 .