Tôi có kịch bản dưới đây như:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Tôi có kịch bản dưới đây như:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Câu trả lời:
Có nhiều cách để thực hiện vòng lặp này.
Với ksh93
cú pháp (cũng được hỗ trợ bởi zsh
và bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Đối với mọi vỏ giống như POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Cả hai vòng lặp ngủ 10 giây trong mỗi lần lặp trước khi kiểm tra lại sự tồn tại của tệp.
Sau khi vòng lặp kết thúc, bạn sẽ phải kiểm tra sự tồn tại của tệp lần cuối để tìm hiểu xem vòng lặp đã thoát do chạy 10 lần hay do tệp xuất hiện.
Nếu bạn muốn và nếu bạn có quyền truy cập vào các công cụ inotify, bạn có thể thay thế sleep 10
cuộc gọi bằng
inotifywait -q -t 10 -e create ./ >/dev/null
Điều này sẽ chờ một sự kiện tạo tệp xảy ra trong thư mục hiện tại, nhưng sẽ hết sau 10 giây. Bằng cách này, vòng lặp của bạn sẽ thoát ngay khi tên tệp đã cho xuất hiện (nếu nó xuất hiện).
Mã đầy đủ, với inotifywait
(thay thế bằng sleep 10
nếu bạn không muốn điều đó), có thể trông giống như
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
như là một thay thế thả vào cho sleep
.
Nếu số lượng không phải là một biến, bạn có thể sử dụng mở rộng dấu ngoặc:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Nếu số lượng là một biến bạn có thể sử dụng seq
lệnh:
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!
mặc dù test -e file && exit
linh hoạt hơn
exists1
vậy, nó vẫn in một loạt lỗi nếu / khi không tìm thấy tệp phù hợp. (Ngoài ra, nó có lỗi nếu có nhiều kết quả khớp.) Bất kỳ shell nào khác mà tôi đã kiểm tra dường như đều có lỗi trong mọi trường hợp ...
done 2<>/dev/null
. Điều đó bash
có kịch bản không? tôi nghĩ rằng nó chỉ -i
ảnh hưởng đến bối cảnh đó. Tuy nhiên, exists?
nhiều như một tên phụ như file
. nhưng vâng, tôi ghét trích dẫn trong chuyển hướng - nếu vít quá nhiều.
test -e
.