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