次のシナリオがあります。
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
このサイクルを完了する方法はいくつかあります。
構文の使用ksh93
(zsh
およびでもサポートされています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
もっと柔軟でありながら