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.