for ループを制御するにはどうすればいいですか?

for ループを制御するにはどうすればいいですか?

次のような「for ループ」があるとします。

#!/bin/bash
for i in $(cat test_file); do 
echo $i
done

テキストファイルの内容は親フォルダ内のフォルダ名です

text_file に 10000 エントリ (つまり変数 i) が含まれている場合、10 回の「エコー」ごとに 10 秒間スリープするように「for loop」に指示するにはどうすればよいでしょうか。言い換えると、for loop が text_file 内の変数 i を読み取るときに、for loop が特定の期間ごとに実行できる変数の数を制御するにはどうすればよいでしょうか。出力は次のようになります。

   Variable #1
   Variable #2
   Variable #3
   .
   .
   .
   .
   sleep 10
    Variable #11
    Variable #12
    Variable #13
   .
   .       .

答え1

以下を使用してくださいバッシュ脚本 (10回の「エコー」ごとに10秒間スリープする):

test.shスクリプトのテスト名です

#!/bin/bash
while ((++i)); read -r line
do
    echo "$line"
    if (( "$i" % 10 == 0)) 
    then
        sleep 10
    fi
done < $1

使用法:

bash test.sh test_file

while ((++i))-入力から行を返すiたびにカウンターが増加しますread -r line

if (( "$i" % 10 == 0))- 現在の行番号iが割り切れるかどうかをチェックします10(実行フローが次の10行に到達することを意味します)

sleep 10- スクリプトを10秒間一時停止します

答え2

xargs -L 10 sh -c 'printf "%s\n" "$@"; sleep 10' sh < test_file

働く

  • xargswith は-L10 行を一度に取得し、それをコマンドに渡しますsh -c。最初の引数はプログラム名として消費され、ダミー名を配置しますsh。その後、これらの 10 行は "$@" として使用できるようになりsh、好きなように実行できます。ここでは、それらを印刷するだけです。その後、sleep10 秒間実行します。その後、xargs次の 10 トランシェが渡され、このサイクルは test_file 内の行がなくなるまで繰り返されます。

関連情報