キーを押すとループ反復をインタラクティブにスキップする

キーを押すとループ反復をインタラクティブにスキップする

配列を繰り返しており、繰り返しごとにプロセスが長く実行されます。

!#/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完了したときに内部ループを終了する方法を提案できます。

おすすめ記事