POSIX 쉘 스크립트에서 할 때까지…


16

잘 알려진 while condition; do ...; done루프가 있지만 do... while블록의 실행을 하나 이상 보장 하는 스타일 루프가 있습니까?


Shawn에게 많은 감사를드립니다. 나는 그 대답이 엄선 된 답변이 될 것이라고 기대하지 않았습니다. 선택해 주셔서 감사합니다.

답변:


15

매우 다양한 버전의 do ... while구조는 다음과 같습니다.

while 
      Commands ...
do :; done

예를 들면 다음과 같습니다.

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

값이 설정되어 있지 않으므로 i루프가 20 번 실행됩니다. 16으로
설정된 행을 주석 해제하면 루프가 4 번 실행됩니다. 를 들어 , , 및 .ii=16
i=16i=17i=18i=19

i가 같은 시점 (시작)에 설정되어 있으면 (루프 브레이크 명령이 테스트 될 때까지) 명령이 여전히 처음으로 실행됩니다.

잠시 동안의 테스트는 진실해야합니다 (종료 상태 0).
때까지 루프에 대해 테스트를 취소해야합니다. 즉, 거짓 (종료 상태가 0이 아님).

POSIX 버전은 작동하도록 몇 가지 요소가 변경되어야합니다.

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 

set -ewhile 조건 블록에서 실패한 것을 사용하면 실행이 중지되지 않습니다. 예를 들어 set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> 똥이 발생합니다. 따라서 이것을 사용하면 오류 처리에 신중해야합니다. 즉 모든 명령을 &&!
Timo

17

루프 도중에 do ... while 또는 do ... do가 없지만 다음과 같이 동일한 작업을 수행 할 수 있습니다.

while true; do
  ...
  condition || break
done

까지 :

until false; do
  ...
  condition && break
done

루프 중 하나와 함께 브레이크 라인 중 하나를 사용할 수 있습니다. true 또는 false까지는 '영원히'를 의미합니다. 나는 조건이 행복 출구 또는 슬픈 출구를 갖는 동안 잠시 동안 또는 때까지 보존한다는 것을 이해합니다.
android.weasel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.