더 적은 문자로 명령을 실행하고 종료 코드를 얻으려면 어떻게해야합니까?


13

나는 다음과 같이 스크립트를 작성했다.

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

항상 some_command두 번 써야한다는 것이 항상 저를 자극 했습니다. 어떻게 든 루프 테스트 섹션에 넣을 수 있습니까?

답변:


20

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

while ! some_command; do sleep 1; done

some_command오류와 함께 종료되는 한 조건은 그대로 유지 됩니다.

또는 추가 검사를 수행하려는 경우 더 자세한 방법을 사용하십시오.

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

이것은 하나의 라이너이지만 내 것보다 낫습니다. ;-)
Anthon

영업 이익은 :)하지만 그는 실패에 여러 명령을 실행해야합니다 여러 행으로 분할 할 수 있습니다
존 WH 스미스

세미콜론에서 줄 바꿈하여 여러 줄로 만들 수없는 이유는 없습니다.
Mark Stewart

1
... 또는 쓰기while ! some_command; do several; commands; sleep 1; done
점화

12

이것이 until루프의 목적입니다.

until some_command
do    sleep 1
done

while루프 의 논리적 부정입니다 .

사양은 말합니다 :

until루프

  • until루프는 계속 실행한다 한 화합물 목록 길이만큼 다른 화합물리스트 0이 아닌 종료 상태를 갖는다.

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

    Compound-list-1까지
    복합 목록 2를 수행
    끝난
  • 화합물리스트 1은 실행되어야하며 그것이 제로 종료 상태의 경우 until명령이 완료한다. 그렇지 않으면 복합리스트 -2 가 실행되고 프로세스가 반복된다.

4

당신은 할 수 있습니다 :

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


5
두 번째 예는 포함하지 않아야 [하고 ]명령 주변.
nyuszika7h

2

POSIX.1-2001 이전에 쉘 환경을 동결 한 시스템에서는 작동 하지 while ! ...않습니다 until .... 그러나 이것은 그렇습니다.

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

완전한 이식성이 필요하지 않은 경우 왜 쉘 스크립트를 작성합니까? 펄은 배쉬보다 사용할 수 있습니다 것.

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

(위와 같이 sleep명령이 실패한 경우에만 실행됩니다.)

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