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

이 주기를 완료하는 방법에는 여러 가지가 있습니다.

구문 사용 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좀 더 유연 하면서도

관련 정보