다음과 같은 시나리오가 있습니다.
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
답변
이 루프를 수행하는 방법에는 여러 가지가 있습니다.
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
답변
개수가 변수가 아닌 경우 중괄호 확장을 사용할 수 있습니다.
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
답변
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
test -e file && exit
더 유연 하지만