Bash에서 루프 n을 반복하는 방법


9

다음과 같은 시나리오가 있습니다.

if [file exists]; then
   exit   
elif
   recheck if file exist (max 10 times)
   if found exit else recheck again as per counter  
fi 

이것은 쉘에서 매우 기본적인 기능입니다. 당신은 그것을 연구 했습니까?
Peschke

예. 그러나 내 코드에서 예상되는 결과를 얻지 못했습니다. 또한 가능한 약어로 작성하고 싶습니다
Rocky86

1
@Peschke는 적어도 세 가지 기본 기능 (루프, 조건부, 파일 테스트, 루프 중단)이 필요합니다. 적어도 그 질문은 분명합니다. Rocky가 시도한 것에 대한 스케치를 포함 할 수는 있지만 어쨌든 누군가가 대답을 완전히 다시 작성합니다. ;)
ilkkachu

답변:


9

이 루프를 수행하는 방법에는 여러 가지가 있습니다.

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

inotify를 사용하면 전체 루프를 거의 대체 할 수 있습니다. 파일이 있는지 테스트하고, 없으면 100 초 동안 inotifywait하십시오. 대부분의 파일부터 생성 될 수있는 단지 검사 및 inotify를 사이에, 그리고 ... 시간 초과하기 전에 전체 백초 잠 것
ilkkachu

1
@ilkkachu 그렇습니다. 좋은 생각이지만 여기서는에 inotifywait대한 대체 대체물로 사용하고 sleep있습니다.
Kusalananda

8

개수가 변수가 아닌 경우 중괄호 확장을 사용할 수 있습니다.

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

파일을 찾을 수없는 경우에만 반복하고 싶습니다 (최대 10 번). 발견되면 세 번째로 말하면 성공적으로 종료됩니다
Rocky86

@ Rocky86 : 이것은 xenoid가 제안한 솔루션과 모순되지 않습니다. 아무도 당신이 끝날 때까지 세도록 강요하지 않습니다 ....
user1934428

나는 이것을 좋아한다$(seq $count)
노동자

0
n=0
until [ "$((n+=1))" -gt 10 ]
do    <exists? command exit
done
echo oh noes!

test -e file && exit더 유연 하지만


왜 물음표? 리디렉션 대상에서 glob의 동작은 셸마다 다릅니다.
Stéphane Chazelas

2
파일을 열면 부작용이 생길 수 있습니다. 예를 들어 fifo의 경우 상당히 나빠질 수 있습니다 (예를 들어 Linux의 경우 / dev / watchdog에 대한 심볼릭 링크가있는 경우)
Stéphane Chazelas

Bash에서도 exists1이와 같은 파일을 찾는 경우에도 일치하는 파일을 찾을 수없는 경우 여전히 많은 오류를 인쇄합니다. (여러 개의 일치 항목이있는 경우에도 오류가 발생합니다.) 테스트 한 다른 쉘은 어떤 경우에도 오류를 발생시키는 것으로 보입니다 ...
ilkkachu

@ikkachu-네. 그것은 요점이었다. 오류가 발생하면 스크립트가보고합니다. stderr를 억제해야하는 경우 억제하십시오 done 2<>/dev/null. 합니까는 bash것을이 스크립트는 무엇입니까? 나는 그것이 -iNteractive 상황 에서만 효과가 있다고 생각했습니다 . 여전히 exists?필러 이름만큼 file입니다. 그러나 그래, 나는 너무 많은 경우-리디렉션에 인용 싫어 .
mikeserv

@ 스테판-이유가 없습니다. 하지만 그래, fifos, 읽을 수없는 ... 그게 내가 언급 한 이유 test -e입니다.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.