명령을 실행하고 더 적은 문자로 종료 코드를 얻는 방법은 무엇입니까?

명령을 실행하고 더 적은 문자로 종료 코드를 얻는 방법은 무엇입니까?

나는 다음과 같은 스크립트를 작성하곤 했습니다.

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

some_command두번 쓰다보니 늘 짜증이 나네요. 어떻게든 이것을 루프 테스트 섹션에 넣을 수 있나요?

답변1

some_command이를 테스트 조건 으로 사용할 수 있습니다 .

while ! some_command; do sleep 1; done

종료 시 오류가 발생하는 한 some_command이 조건은 true로 유지됩니다 .

또는 추가 검사를 수행하려면 보다 자세한 접근 방식을 사용할 수 있습니다.

while ! some_command
do 
    # add more if desired
    sleep 1
done

답변2

루프의 용도는 다음과 같습니다 until.

until some_command
do    sleep 1
done

그것은 순환성의 논리적 부정이다 while.

이것사양은 다음과 같습니다.

until고리

  • 이 작업은 until연속적으로 실행되어야 합니다.화합물 목록또 다른화합물 목록0이 아닌 종료 상태가 있습니다.

  • Until 루프의 형식은 다음과 같습니다.

    화합물 목록-1까지
    화합물 목록 2 실행
    완벽한
  • 이것화합물 목록-1실행되어야 하며, 종료 상태가 0이면 until명령이 완료됩니다. 그렇지 않으면,화합물 목록-2실행되고 프로세스가 반복됩니다.

답변3

다음을 수행할 수 있습니다.

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

여기에는 단점이 있지만 항상 먼저 1초 동안 잠을 자게 됩니다.

여러 명령 중 하나를 사용하여 0으로 종료하려면 다음을 수행할 수 있습니다.

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

이는 물론 다음에도 적용됩니다.some_command

답변4

또한 POSIX.1-2001 이전에 쉘 환경을 고정한 시스템에는 while ! ...적용 되지 않습니다 . until ...그러나 그렇습니다.

while :; do
    if some command; then
        break
    fi
    sleep 1
done

완전한 이식성이 필요하지 않은 경우 쉘 스크립트를 작성하는 이유는 무엇입니까? 펄은아마도 Bash보다 더 유용할 것입니다.

sleep 1 while 0 != system qw(some command);

(위에서 언급했듯이 sleep명령이 실패한 경우에만 실행됩니다.)

관련 정보