2014-04-28 4 views
1

이 스크립트는 30 초 동안 5 초마다 파일의 존재 여부를 확인합니다. 스크립트는 파일이 나타날 때까지 대기합니다. 파일을 찾으면 "정보 : 완료 대기 ".조건문을 사용하여 while 루프에서 오류 메시지를 배치

파일을 찾을 수없는 경우 오류 메시지가 나타난 후 30 초 후에 이 종료됩니다.

스크립트가 구성된 방식으로 이제 각 루프 이후에 오류 시간 초과가 인쇄됩니다.

#!/bin/bash 
count=1 
while [ $count -le 6 ] 
do 
    if [ ! -e /tmp/2007.txt ] 
    then 
     echo "info : sleeping for 5 seconds" 
     ((count++)) 
    sleep 5 
    elsif [ -e /tmp/2007.txt ] 
    echo "info: done waiting" 
    break 
    fi 
echo "error: timeout" 
done 

내가

info : sleeping for 5 seconds 
error: timeout 
info : sleeping for 5 seconds 
error: timeout 
info : sleeping for 5 seconds 
error: timeout 
info : sleeping for 5 seconds 
error: timeout 
info : sleeping for 5 seconds 
error: timeout 
info : sleeping for 5 seconds 
error: timeout 

내가 루프 밖으로 배치하면 (나쁜) 무엇을 얻을 -

break 
    fi 

done 
echo "error: timeout" 

큰이 내가 무엇을 얻을 작동

[email protected] ~ $ /tmp/wait_while 
info : sleeping for 5 seconds 
info : sleeping for 5 seconds 
info : sleeping for 5 seconds 
info : sleeping for 5 seconds 
info : sleeping for 5 seconds 
info : sleeping for 5 seconds 
error: timeout 
[email protected] ~ $ 

그러나 내가 /tmp/2007.txt 파일을 터치하면 bu가 중단됩니다. 오류 타임 아웃 여전히

[email protected] ~ $ /tmp/wait_while 
info : sleeping for 5 seconds 
info : sleeping for 5 seconds 
info: done waiting 
error: timeout 

을 보여줍니다 t에이 쉬운 질문이지만, 내가 이해가 공통의 문제를 반영 조건문과 장소들을 배치하는 방법으로 루프 때문에 지역 사회에 여기 데려입니다 진술. 필자는 스크립팅 작업에서이 부분을 발견했으며이를 이해해야합니다. 진화해야합니다. 내가 찾고있는 스크립트는 30 초 동안 검사하고, 오류 메시지를 표시하지 못하면 아무것도 찾지 않습니다. 스크립트가 파일을 찾으면 오류 메시지를 알려주고 알리지 않기를 원합니다.

답변

0

오류 메시지를 표시하기 전에 파일을 찾았는지 여부를 while 루프 후에 확인할 수 있습니다.

#!/bin/bash 

found=0 
count=1 
while [ $count -le 6 ] 
do 
    if [ ! -e /tmp/2007.txt ] 
    then 
     echo "info : sleeping for 5 seconds" 
     ((count++)) 
     sleep 5 
    else 
     echo "info: done waiting" 
     found=1 
     break 
    fi 
done 

if [ ! $found ] 
then 
    echo "error: timeout" 
fi 
+0

:''동안 ((계산 <= 6))''. 또한 bash를 사용한다면''[]''을 사용하지 말아야하며''[[]]''을 선호하십시오. –

0

은 당신은 원하는 파일이 발견되지 않을 경우 즉,의 while 루프가 "실패"하면 "시간 초과"메시지를 인쇄 할. 지금까지 발견

while ((++count <= 6)) 
do 
    if [ ! -e /tmp/2007.txt ] 
    then 
     echo "info : sleeping for 5 seconds" 
     sleep 5 
    elif [ -e /tmp/2007.txt ]; then 
     echo "info: done waiting" 
     break 
    fi 
    false 
done || echo "error: timeout" 

/tmp/2007.txt 경우 제로 (0) 종료 상태가 (당신이 로깅을 제거한 경우, 또는 [ -e /tmp/2007.txt ]), 실행 루프의 마지막 명령은 echo 문이 될 것입니다 : 당신은 다음을 사용할 수 있습니다. 그렇지 않은 경우 마지막으로 실행할 명령은 false이며 항상 종료 상태가 0이 아니므로 루프의 종료 상태도 0이 아닙니다.

0

당신은 파일의 존재 여부에 대해 "하면서"루프 점검을, 30 초 동안 "하면서"루프 잠을 만들 수 있습니다 :

파일의 존재에 대한 "하면서"루프 검사합니다 :

#!/bin/bash 
count=0 
timed_out=false 
while [ ! -e file ]; do 
    echo "info : sleeping for 5 seconds" 
    ((count++)) 
    sleep 5 
    if [ $count -eq 6 ]; then 
     timed_out=true 
     break 
    fi  
done 
if $timed_out; then 
    echo "error: timeout" 
    exit 1  # error 
else 
    echo "info: done waiting" 
    exit 0  # success 
fi 

30 초 동안 "하면서"루프 잠을 확인 :이 같은 comparisions에 대한 산술 표현식을 사용할 수 있습니다

#!/bin/bash 
timed_out=true 
count=0 
while [ $count -lt 6 ]; do 
    if [ ! -e file ]; then 
     echo "info : sleeping for 5 seconds" 
     ((count++)) 
     sleep 5 
    else 
     timed_out=false 
     break 
    fi 
done 
if $timed_out; then 
    echo "error: timeout" 
    exit 1  # error 
else 
    echo "info: done waiting" 
    exit 0  # success 
fi