Saya memiliki skenario di bawah ini seperti:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Saya memiliki skenario di bawah ini seperti:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Jawaban:
Ada banyak cara untuk melakukan loop ini.
Dengan ksh93
sintaks (juga didukung oleh zsh
dan bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Untuk setiap shell mirip POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Kedua loop tidur 10 detik di setiap iterasi sebelum menguji keberadaan file lagi.
Setelah loop selesai, Anda harus menguji keberadaan file terakhir kali untuk mengetahui apakah loop keluar karena berjalan 10 kali atau karena file muncul.
Jika Anda mau, dan jika Anda memiliki akses ke alat yang tidak sah, Anda dapat mengganti sleep 10
panggilan dengan
inotifywait -q -t 10 -e create ./ >/dev/null
Ini akan menunggu acara pembuatan file terjadi di direktori saat ini, tetapi akan habis setelah 10 detik. Dengan cara ini loop Anda akan keluar segera setelah nama file yang diberikan muncul (jika muncul).
Kode lengkap, dengan inotifywait
(ganti dengan sleep 10
jika Anda tidak menginginkannya), mungkin terlihat seperti
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
inotifywait
sebagai pengganti drop-in sleep
.
Jika jumlah bukan variabel, Anda dapat menggunakan ekspansi brace:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Jika jumlah adalah variabel, Anda dapat menggunakan seq
perintah:
count=10
for i in $(seq $count)
do
whatever
done
$(seq $count)
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
meskipun test -e file && exit
lebih fleksibel
exists1
atau seperti itu, masih mencetak banyak kesalahan jika / ketika file yang cocok tidak ditemukan. (Juga kesalahan jika ada beberapa pertandingan.) Setiap shell lain yang saya uji tampaknya memberikan kesalahan dalam hal apapun ...
done 2<>/dev/null
. apakah bash
itu dituliskan? Saya pikir itu hanya berhasil dalam -i
konteks nteraktif. masih, exists?
sebanyak nama pengisi sebagai file
. tapi ya, saya benci mengutip pengalihan - jika sekrup begitu banyak.
test -e
.