bash 스크립트 : 오류를 반환하면 명령을 반복하십시오.


답변:


40

serverfault의 다른 곳 에서이 우아한 루프의 기초를 찾았습니다. 명령 자체에서 직접 테스트 할 수 있으므로 종료 코드를 저장할 필요가 없습니다.

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

거의. 루프 전에 미리 설정할 수 있도록 반환 값을 변수로 저장하는 것이 좋습니다. 그렇지 않으면 마지막 실행 명령의 영향을받습니다.

sleep너무 빨리 리스폰되는 것을 막기 위해 슬링 인을 넣을 수도 있습니다 .

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

종료 코드를 RET 변수에 전달하는 것을 잊었지만 생각이 듭니다. 내 주요 질문은 언제까지 절이 평가됩니까? C에서는 루프가 처음 실행될 때까지 평가되지 않으며,이 경우 루프가 작동합니다. 그러나 수면과 같은 중간 명령을 허용하므로 여전히 더 좋습니다. 감사!
Roy

잘 발견되었습니다. 편집했습니다. 이 절은 첫 실행 전에 평가됩니다. 이전에는 이전 명령의 리턴 코드를 사용했습니다. 배쉬는 이중 등식을 적용하지 않지만 사용하는 것이 좋습니다.
Dan Carley

== 문자열 평등은 숫자가 아닌 숫자입니다.이 경우에는 문제가되지 않습니다 ...
Kyle Brandt

단일 및 이중 등가는 동일합니다. 그러나 이제 언급 했으므로 정수 평등을 사용하는 것이 좋습니다.
Dan Carley

1
리턴 코드 번호를 테스트 할 필요는 없습니다. 프로그램까지 리턴 할 수 있습니다. 3을 자십시오; 완료.
chris

3

조금 해 키지 만 내 솔루션은 실패로 종료되면 자체 실행되는 bash 함수를 만드는 것입니다.

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

0

명령이 오류를 반환하는 동안 루프를 수행 할 수 있습니다.

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

3
이 답변에는 설명이 필요합니다.
kasperd

@kasperd 설명이 추가됨
Andrés Rivas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.