Bashでループをn回繰り返す方法

Bashでループをn回繰り返す方法

次のシナリオがあります。

if [file exists]; then
   exit   
elif
   recheck if file exist (max 10 times)
   if found exit else recheck again as per counter  
fi 

答え1

数が変数でない場合は、中かっこ拡張を使用できます。

for i in {1..10}   # you can also use {0..9}
do
  whatever
done

数が変数の場合は、次のseqコマンドを使用できます。

count=10
for i in $(seq $count)
do
  whatever
done

答え2

このサイクルを完了する方法はいくつかあります。

構文の使用ksh93zshおよびでもサポートされていますbash):

for (( i=0; i<10; ++i)); do
    [ -e filename ] && break
    sleep 10
done

POSIXに似たシェルの場合:

n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
    n=$(( n + 1 ))
    sleep 10
done

両方のループは、各反復ごとに10秒間待機してから、ファイルの存在を再テストします。

ループが終了した後、ループが10回実行されて終了したか、ファイルが表示されて終了したかどうかを確認するために、最後にファイルの存在をテストする必要があります。

必要に応じてinotify-toolsへのアクセス権がある場合は、sleep 10呼び出しを次のように置き換えることができます。

inotifywait -q -t 10 -e create ./ >/dev/null

現在のディレクトリでファイル生成イベントが発生するのを待ちますが、10秒後にタイムアウトします。これにより、指定されたファイル名が表示されるとすぐにループが終了します(存在する場合)。

完全なコード(inotifywait望ましくない場合は次に置き換えます)は次のとおりです。sleep 10

for (( i=0; i<10; ++i)); do
    [ -e filename ] && break
    inotifywait -q -t 10 -e create ./ >/dev/null
done

if [ -e filename ]; then
    echo 'file appeared!'
else
    echo 'file did not turn up in time'
fi

答え3

n=0
until [ "$((n+=1))" -gt 10 ]
do    <exists? command exit
done
echo oh noes!

test -e file && exitもっと柔軟でありながら

関連情報