답변:
매우 다양한 버전의 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 번 실행됩니다.
를 들어 , , 및 .i
i=16
i=16
i=17
i=18
i=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 -e
while 조건 블록에서 실패한 것을 사용하면 실행이 중지되지 않습니다. 예를 들어 set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done
-> 똥이 발생합니다. 따라서 이것을 사용하면 오류 처리에 신중해야합니다. 즉 모든 명령을 &&
!
루프 도중에 do ... while 또는 do ... do가 없지만 다음과 같이 동일한 작업을 수행 할 수 있습니다.
while true; do
...
condition || break
done
까지 :
until false; do
...
condition && break
done