配列を繰り返しており、繰り返しごとにプロセスが長く実行されます。
!#/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
完了したときに内部ループを終了する方法を提案できます。